mirror of
https://codeberg.org/timelimit/timelimit-server.git
synced 2026-08-31 19:03:45 +02:00
Compare commits
31
Commits
2021-05-25
...
2022-01-25
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c65aba589 | ||
|
|
b148492d59 | ||
|
|
f028b99bbc | ||
|
|
b43059f8e2 | ||
|
|
5825ac617f | ||
|
|
387d4cd53c | ||
|
|
e1bbff7e07 | ||
|
|
48d7d83db3 | ||
|
|
54faa8cef3 | ||
|
|
a179f21ef7 | ||
|
|
4a908df57c | ||
|
|
03890f209a | ||
|
|
50c0982bd3 | ||
|
|
14190073c1 | ||
|
|
7331767a85 | ||
|
|
80291b8835 | ||
|
|
0663650d9b | ||
|
|
3a59743de9 | ||
|
|
add8787624 | ||
|
|
3715581d10 | ||
|
|
9f2ea6e741 | ||
|
|
bc80ccc731 | ||
|
|
6bf6cce720 | ||
|
|
5950f7348f | ||
|
|
8d4ffab683 | ||
|
|
44e292309c | ||
|
|
da02bbb2df | ||
|
|
98819fa2d5 | ||
|
|
82230f6c40 | ||
|
|
70a4d36b16 | ||
|
|
9d08f3d324 |
@@ -0,0 +1,3 @@
|
|||||||
|
node_modules
|
||||||
|
build
|
||||||
|
scripts
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
plugins: [
|
||||||
|
'@typescript-eslint',
|
||||||
|
],
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
],
|
||||||
|
env: {
|
||||||
|
node: true
|
||||||
|
}
|
||||||
|
};
|
||||||
+6
-3
@@ -1,12 +1,15 @@
|
|||||||
FROM node:14-alpine
|
FROM node:16-alpine
|
||||||
|
|
||||||
# Create app directories
|
# Create app directories
|
||||||
RUN mkdir -p /usr/src/app
|
RUN mkdir -p /usr/src/app
|
||||||
WORKDIR /usr/src/app
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
# Install app dependencies
|
# Install app dependencies
|
||||||
COPY . /usr/src/app/
|
COPY package.json package-lock.json tsconfig.json .eslintignore .eslintrc.js Readme.md /usr/src/app/
|
||||||
RUN npm install --no-optional && npm run build && npm prune --production && rm -rf ./src
|
COPY src/ /usr/src/app/src/
|
||||||
|
COPY scripts/ /usr/src/app/scripts/
|
||||||
|
COPY other/ /usr/src/app/other/
|
||||||
|
RUN mkdir -p docs/schema && npm install --no-optional && npm run build && npm prune --production && rm -rf ./src
|
||||||
|
|
||||||
# Start the App
|
# Start the App
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
|||||||
+4
-1
@@ -24,7 +24,8 @@ see [this JSON schema](../schema/sendmaillogincoderequest.md)
|
|||||||
```
|
```
|
||||||
{
|
{
|
||||||
"mail": "test@timelimit.io",
|
"mail": "test@timelimit.io",
|
||||||
"locale": "de"
|
"locale": "de",
|
||||||
|
"deviceAuthToken": "1234abcde"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -34,6 +35,8 @@ If the request body is malformed or the mail address is invalid: HTTP status cod
|
|||||||
|
|
||||||
If the rate limit was exceeded: HTTP status code 429 Too Many Requests
|
If the rate limit was exceeded: HTTP status code 429 Too Many Requests
|
||||||
|
|
||||||
|
If a deviceAuthToken was sent which is invalid: HTTP status code 401 Unauthorized
|
||||||
|
|
||||||
If a whitelist was configured and the mail address is not within it: ``{"mailAddressNotWhitelisted": true}``
|
If a whitelist was configured and the mail address is not within it: ``{"mailAddressNotWhitelisted": true}``
|
||||||
|
|
||||||
If a blacklist was configured and the mail server is within it: ``{"mailServerBlacklisted": true}``
|
If a blacklist was configured and the mail server is within it: ``{"mailServerBlacklisted": true}``
|
||||||
|
|||||||
+11
-223
@@ -48,404 +48,192 @@
|
|||||||
|
|
||||||
### Objects
|
### Objects
|
||||||
|
|
||||||
* [CategoryDataStatus](./clientpullchangesrequest-definitions-clientdatastatus-properties-categories-categorydatastatus.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/categories/additionalProperties`
|
|
||||||
|
|
||||||
* [CategoryDataStatus](./clientpullchangesrequest-definitions-clientdatastatus-properties-categories-categorydatastatus.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/categories/additionalProperties`
|
|
||||||
|
|
||||||
* [CategoryDataStatus](./clientpullchangesrequest-definitions-categorydatastatus.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/CategoryDataStatus`
|
* [CategoryDataStatus](./clientpullchangesrequest-definitions-categorydatastatus.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/CategoryDataStatus`
|
||||||
|
|
||||||
* [ClientDataStatus](./clientpullchangesrequest-properties-clientdatastatus.md) – `https://timelimit.io/ClientPullChangesRequest#/properties/status`
|
|
||||||
|
|
||||||
* [ClientDataStatus](./clientpullchangesrequest-definitions-clientdatastatus.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus`
|
* [ClientDataStatus](./clientpullchangesrequest-definitions-clientdatastatus.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus`
|
||||||
|
|
||||||
* [ClientPushChangesRequestAction](./clientpushchangesrequest-properties-actions-clientpushchangesrequestaction.md) – `https://timelimit.io/ClientPushChangesRequest#/properties/actions/items`
|
|
||||||
|
|
||||||
* [ClientPushChangesRequestAction](./clientpushchangesrequest-definitions-clientpushchangesrequestaction.md) – `https://timelimit.io/ClientPushChangesRequest#/definitions/ClientPushChangesRequestAction`
|
* [ClientPushChangesRequestAction](./clientpushchangesrequest-definitions-clientpushchangesrequestaction.md) – `https://timelimit.io/ClientPushChangesRequest#/definitions/ClientPushChangesRequestAction`
|
||||||
|
|
||||||
* [NewDeviceInfo](./signintofamilyrequest-definitions-newdeviceinfo.md) – `https://timelimit.io/SignIntoFamilyRequest#/definitions/NewDeviceInfo`
|
|
||||||
|
|
||||||
* [NewDeviceInfo](./signintofamilyrequest-properties-newdeviceinfo.md) – `https://timelimit.io/SignIntoFamilyRequest#/properties/parentDevice`
|
|
||||||
|
|
||||||
* [NewDeviceInfo](./registerchilddevicerequest-definitions-newdeviceinfo.md) – `https://timelimit.io/RegisterChildDeviceRequest#/definitions/NewDeviceInfo`
|
|
||||||
|
|
||||||
* [NewDeviceInfo](./registerchilddevicerequest-properties-newdeviceinfo.md) – `https://timelimit.io/RegisterChildDeviceRequest#/properties/childDevice`
|
|
||||||
|
|
||||||
* [NewDeviceInfo](./createfamilybymailtokenrequest-definitions-newdeviceinfo.md) – `https://timelimit.io/CreateFamilyByMailTokenRequest#/definitions/NewDeviceInfo`
|
* [NewDeviceInfo](./createfamilybymailtokenrequest-definitions-newdeviceinfo.md) – `https://timelimit.io/CreateFamilyByMailTokenRequest#/definitions/NewDeviceInfo`
|
||||||
|
|
||||||
* [NewDeviceInfo](./createfamilybymailtokenrequest-properties-newdeviceinfo.md) – `https://timelimit.io/CreateFamilyByMailTokenRequest#/properties/parentDevice`
|
* [NewDeviceInfo](./registerchilddevicerequest-definitions-newdeviceinfo.md) – `https://timelimit.io/RegisterChildDeviceRequest#/definitions/NewDeviceInfo`
|
||||||
|
|
||||||
* [ParentPassword](./serializedparentaction-definitions-serializedadduseraction-properties-parentpassword.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedAddUserAction/properties/password`
|
* [NewDeviceInfo](./signintofamilyrequest-definitions-newdeviceinfo.md) – `https://timelimit.io/SignIntoFamilyRequest#/definitions/NewDeviceInfo`
|
||||||
|
|
||||||
* [ParentPassword](./createfamilybymailtokenrequest-definitions-parentpassword.md) – `https://timelimit.io/CreateFamilyByMailTokenRequest#/definitions/ParentPassword`
|
* [ParentPassword](./createfamilybymailtokenrequest-definitions-parentpassword.md) – `https://timelimit.io/CreateFamilyByMailTokenRequest#/definitions/ParentPassword`
|
||||||
|
|
||||||
* [ParentPassword](./recoverparentpasswordrequest-properties-parentpassword.md) – `https://timelimit.io/RecoverParentPasswordRequest#/properties/password`
|
|
||||||
|
|
||||||
* [ParentPassword](./recoverparentpasswordrequest-definitions-parentpassword.md) – `https://timelimit.io/RecoverParentPasswordRequest#/definitions/ParentPassword`
|
* [ParentPassword](./recoverparentpasswordrequest-definitions-parentpassword.md) – `https://timelimit.io/RecoverParentPasswordRequest#/definitions/ParentPassword`
|
||||||
|
|
||||||
* [ParentPassword](./serializedparentaction-definitions-serializedsetchildpasswordaction-properties-parentpassword.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetChildPasswordAction/properties/newPassword`
|
|
||||||
|
|
||||||
* [ParentPassword](./serializedparentaction-definitions-parentpassword.md) – `https://timelimit.io/SerializedParentAction#/definitions/ParentPassword`
|
|
||||||
|
|
||||||
* [ParentPassword](./createfamilybymailtokenrequest-properties-parentpassword.md) – `https://timelimit.io/CreateFamilyByMailTokenRequest#/properties/parentPassword`
|
|
||||||
|
|
||||||
* [ParentPassword](./serializedparentaction-definitions-serializedsetchildpasswordaction-properties-parentpassword.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetChildPasswordAction/properties/newPassword`
|
|
||||||
|
|
||||||
* [ParentPassword](./serializedparentaction-definitions-serializedadduseraction-properties-parentpassword.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedAddUserAction/properties/password`
|
|
||||||
|
|
||||||
* [ParentPassword](./serializedchildaction-definitions-parentpassword.md) – `https://timelimit.io/SerializedChildAction#/definitions/ParentPassword`
|
* [ParentPassword](./serializedchildaction-definitions-parentpassword.md) – `https://timelimit.io/SerializedChildAction#/definitions/ParentPassword`
|
||||||
|
|
||||||
* [ParentPassword](./serializedchildaction-definitions-serializedchildchangepasswordaction-properties-parentpassword.md) – `https://timelimit.io/SerializedChildAction#/definitions/SerializedChildChangePasswordAction/properties/password`
|
* [ParentPassword](./serializedparentaction-definitions-parentpassword.md) – `https://timelimit.io/SerializedParentAction#/definitions/ParentPassword`
|
||||||
|
|
||||||
* [ParentPassword](./serializedchildaction-definitions-serializedchildchangepasswordaction-properties-parentpassword.md) – `https://timelimit.io/SerializedChildAction#/definitions/SerializedChildChangePasswordAction/properties/password`
|
|
||||||
|
|
||||||
* [SerialiezdTriedDisablingDeviceAdminAction](./serializedapplogicaction-anyof-serialiezdtrieddisablingdeviceadminaction.md) – `https://timelimit.io/SerializedAppLogicAction#/anyOf/7`
|
|
||||||
|
|
||||||
* [SerialiezdTriedDisablingDeviceAdminAction](./serializedapplogicaction-definitions-serialiezdtrieddisablingdeviceadminaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerialiezdTriedDisablingDeviceAdminAction`
|
* [SerialiezdTriedDisablingDeviceAdminAction](./serializedapplogicaction-definitions-serialiezdtrieddisablingdeviceadminaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerialiezdTriedDisablingDeviceAdminAction`
|
||||||
|
|
||||||
* [SerialiizedUpdateNetworkTimeVerificationAction](./serializedparentaction-definitions-serialiizedupdatenetworktimeverificationaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerialiizedUpdateNetworkTimeVerificationAction`
|
* [SerialiizedUpdateNetworkTimeVerificationAction](./serializedparentaction-definitions-serialiizedupdatenetworktimeverificationaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerialiizedUpdateNetworkTimeVerificationAction`
|
||||||
|
|
||||||
* [SerialiizedUpdateNetworkTimeVerificationAction](./serializedparentaction-anyof-serialiizedupdatenetworktimeverificationaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/41`
|
|
||||||
|
|
||||||
* [SerializeResetCategoryNetworkIdsAction](./serializedparentaction-definitions-serializeresetcategorynetworkidsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializeResetCategoryNetworkIdsAction`
|
* [SerializeResetCategoryNetworkIdsAction](./serializedparentaction-definitions-serializeresetcategorynetworkidsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializeResetCategoryNetworkIdsAction`
|
||||||
|
|
||||||
* [SerializeResetCategoryNetworkIdsAction](./serializedparentaction-anyof-serializeresetcategorynetworkidsaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/14`
|
|
||||||
|
|
||||||
* [SerializedAddCategoryAppsAction](./serializedparentaction-definitions-serializedaddcategoryappsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedAddCategoryAppsAction`
|
* [SerializedAddCategoryAppsAction](./serializedparentaction-definitions-serializedaddcategoryappsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedAddCategoryAppsAction`
|
||||||
|
|
||||||
* [SerializedAddCategoryAppsAction](./serializedparentaction-anyof-serializedaddcategoryappsaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/0`
|
|
||||||
|
|
||||||
* [SerializedAddCategoryNetworkIdAction](./serializedparentaction-anyof-serializedaddcategorynetworkidaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/1`
|
|
||||||
|
|
||||||
* [SerializedAddCategoryNetworkIdAction](./serializedparentaction-definitions-serializedaddcategorynetworkidaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedAddCategoryNetworkIdAction`
|
* [SerializedAddCategoryNetworkIdAction](./serializedparentaction-definitions-serializedaddcategorynetworkidaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedAddCategoryNetworkIdAction`
|
||||||
|
|
||||||
* [SerializedAddInstalledAppsAction](./serializedapplogicaction-anyof-serializedaddinstalledappsaction.md) – `https://timelimit.io/SerializedAppLogicAction#/anyOf/0`
|
|
||||||
|
|
||||||
* [SerializedAddInstalledAppsAction](./serializedapplogicaction-definitions-serializedaddinstalledappsaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddInstalledAppsAction`
|
* [SerializedAddInstalledAppsAction](./serializedapplogicaction-definitions-serializedaddinstalledappsaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddInstalledAppsAction`
|
||||||
|
|
||||||
* [SerializedAddUsedTimeAction](./serializedapplogicaction-definitions-serializedaddusedtimeaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeAction`
|
* [SerializedAddUsedTimeAction](./serializedapplogicaction-definitions-serializedaddusedtimeaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeAction`
|
||||||
|
|
||||||
* [SerializedAddUsedTimeAction](./serializedapplogicaction-anyof-serializedaddusedtimeaction.md) – `https://timelimit.io/SerializedAppLogicAction#/anyOf/1`
|
|
||||||
|
|
||||||
* [SerializedAddUsedTimeActionVersion2](./serializedapplogicaction-anyof-serializedaddusedtimeactionversion2.md) – `https://timelimit.io/SerializedAppLogicAction#/anyOf/2`
|
|
||||||
|
|
||||||
* [SerializedAddUsedTimeActionVersion2](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2`
|
* [SerializedAddUsedTimeActionVersion2](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2`
|
||||||
|
|
||||||
* [SerializedAddUserAction](./serializedparentaction-definitions-serializedadduseraction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedAddUserAction`
|
* [SerializedAddUserAction](./serializedparentaction-definitions-serializedadduseraction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedAddUserAction`
|
||||||
|
|
||||||
* [SerializedAddUserAction](./serializedparentaction-anyof-serializedadduseraction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/2`
|
* [SerializedAppActivityItem](./serializedapplogicaction-definitions-serializedappactivityitem.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAppActivityItem`
|
||||||
|
|
||||||
* [SerializedAppActivityItem](./serverdatastatus-definitions-serverinstalledappsdata-properties-activities-serializedappactivityitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/activities/items`
|
|
||||||
|
|
||||||
* [SerializedAppActivityItem](./serverdatastatus-definitions-serverinstalledappsdata-properties-activities-serializedappactivityitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/activities/items`
|
|
||||||
|
|
||||||
* [SerializedAppActivityItem](./serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-updatedoradded-serializedappactivityitem.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/updatedOrAdded/items`
|
|
||||||
|
|
||||||
* [SerializedAppActivityItem](./serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-updatedoradded-serializedappactivityitem.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/updatedOrAdded/items`
|
|
||||||
|
|
||||||
* [SerializedAppActivityItem](./serverdatastatus-definitions-serializedappactivityitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/SerializedAppActivityItem`
|
* [SerializedAppActivityItem](./serverdatastatus-definitions-serializedappactivityitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/SerializedAppActivityItem`
|
||||||
|
|
||||||
* [SerializedAppActivityItem](./serializedapplogicaction-definitions-serializedappactivityitem.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAppActivityItem`
|
|
||||||
|
|
||||||
* [SerializedChangeParentPasswordAction](./serializedparentaction-definitions-serializedchangeparentpasswordaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedChangeParentPasswordAction`
|
* [SerializedChangeParentPasswordAction](./serializedparentaction-definitions-serializedchangeparentpasswordaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedChangeParentPasswordAction`
|
||||||
|
|
||||||
* [SerializedChangeParentPasswordAction](./serializedparentaction-anyof-serializedchangeparentpasswordaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/3`
|
|
||||||
|
|
||||||
* [SerializedChildChangePasswordAction](./serializedchildaction-definitions-serializedchildchangepasswordaction.md) – `https://timelimit.io/SerializedChildAction#/definitions/SerializedChildChangePasswordAction`
|
* [SerializedChildChangePasswordAction](./serializedchildaction-definitions-serializedchildchangepasswordaction.md) – `https://timelimit.io/SerializedChildAction#/definitions/SerializedChildChangePasswordAction`
|
||||||
|
|
||||||
* [SerializedChildChangePasswordAction](./serializedchildaction-anyof-serializedchildchangepasswordaction.md) – `https://timelimit.io/SerializedChildAction#/anyOf/0`
|
|
||||||
|
|
||||||
* [SerializedChildSignInAction](./serializedchildaction-definitions-serializedchildsigninaction.md) – `https://timelimit.io/SerializedChildAction#/definitions/SerializedChildSignInAction`
|
* [SerializedChildSignInAction](./serializedchildaction-definitions-serializedchildsigninaction.md) – `https://timelimit.io/SerializedChildAction#/definitions/SerializedChildSignInAction`
|
||||||
|
|
||||||
* [SerializedChildSignInAction](./serializedchildaction-anyof-serializedchildsigninaction.md) – `https://timelimit.io/SerializedChildAction#/anyOf/1`
|
|
||||||
|
|
||||||
* [SerializedCreateCategoryAction](./serializedparentaction-definitions-serializedcreatecategoryaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedCreateCategoryAction`
|
* [SerializedCreateCategoryAction](./serializedparentaction-definitions-serializedcreatecategoryaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedCreateCategoryAction`
|
||||||
|
|
||||||
* [SerializedCreateCategoryAction](./serializedparentaction-anyof-serializedcreatecategoryaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/4`
|
|
||||||
|
|
||||||
* [SerializedCreateTimelimtRuleAction](./serializedparentaction-definitions-serializedcreatetimelimtruleaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedCreateTimelimtRuleAction`
|
* [SerializedCreateTimelimtRuleAction](./serializedparentaction-definitions-serializedcreatetimelimtruleaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedCreateTimelimtRuleAction`
|
||||||
|
|
||||||
* [SerializedCreateTimelimtRuleAction](./serializedparentaction-anyof-serializedcreatetimelimtruleaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/5`
|
|
||||||
|
|
||||||
* [SerializedDeleteCategoryAction](./serializedparentaction-anyof-serializeddeletecategoryaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/6`
|
|
||||||
|
|
||||||
* [SerializedDeleteCategoryAction](./serializedparentaction-definitions-serializeddeletecategoryaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedDeleteCategoryAction`
|
* [SerializedDeleteCategoryAction](./serializedparentaction-definitions-serializeddeletecategoryaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedDeleteCategoryAction`
|
||||||
|
|
||||||
* [SerializedDeleteChildTaskAction](./serializedparentaction-definitions-serializeddeletechildtaskaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedDeleteChildTaskAction`
|
* [SerializedDeleteChildTaskAction](./serializedparentaction-definitions-serializeddeletechildtaskaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedDeleteChildTaskAction`
|
||||||
|
|
||||||
* [SerializedDeleteChildTaskAction](./serializedparentaction-anyof-serializeddeletechildtaskaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/7`
|
|
||||||
|
|
||||||
* [SerializedDeleteTimeLimitRuleAction](./serializedparentaction-anyof-serializeddeletetimelimitruleaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/8`
|
|
||||||
|
|
||||||
* [SerializedDeleteTimeLimitRuleAction](./serializedparentaction-definitions-serializeddeletetimelimitruleaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedDeleteTimeLimitRuleAction`
|
* [SerializedDeleteTimeLimitRuleAction](./serializedparentaction-definitions-serializeddeletetimelimitruleaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedDeleteTimeLimitRuleAction`
|
||||||
|
|
||||||
* [SerializedForceSyncAction](./serializedapplogicaction-anyof-serializedforcesyncaction.md) – `https://timelimit.io/SerializedAppLogicAction#/anyOf/3`
|
|
||||||
|
|
||||||
* [SerializedForceSyncAction](./serializedapplogicaction-definitions-serializedforcesyncaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedForceSyncAction`
|
* [SerializedForceSyncAction](./serializedapplogicaction-definitions-serializedforcesyncaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedForceSyncAction`
|
||||||
|
|
||||||
* [SerializedIgnoreManipulationAction](./serializedparentaction-anyof-serializedignoremanipulationaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/9`
|
|
||||||
|
|
||||||
* [SerializedIgnoreManipulationAction](./serializedparentaction-definitions-serializedignoremanipulationaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction`
|
* [SerializedIgnoreManipulationAction](./serializedparentaction-definitions-serializedignoremanipulationaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction`
|
||||||
|
|
||||||
* [SerializedIncrementCategoryExtraTimeAction](./serializedparentaction-anyof-serializedincrementcategoryextratimeaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/10`
|
|
||||||
|
|
||||||
* [SerializedIncrementCategoryExtraTimeAction](./serializedparentaction-definitions-serializedincrementcategoryextratimeaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedIncrementCategoryExtraTimeAction`
|
* [SerializedIncrementCategoryExtraTimeAction](./serializedparentaction-definitions-serializedincrementcategoryextratimeaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedIncrementCategoryExtraTimeAction`
|
||||||
|
|
||||||
* [SerializedInstalledApp](./serializedapplogicaction-definitions-serializedaddinstalledappsaction-properties-apps-serializedinstalledapp.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddInstalledAppsAction/properties/apps/items`
|
|
||||||
|
|
||||||
* [SerializedInstalledApp](./serializedapplogicaction-definitions-serializedinstalledapp.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedInstalledApp`
|
* [SerializedInstalledApp](./serializedapplogicaction-definitions-serializedinstalledapp.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedInstalledApp`
|
||||||
|
|
||||||
* [SerializedInstalledApp](./serializedapplogicaction-definitions-serializedaddinstalledappsaction-properties-apps-serializedinstalledapp.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddInstalledAppsAction/properties/apps/items`
|
|
||||||
|
|
||||||
* [SerializedInstalledApp](./serverdatastatus-definitions-serverinstalledappsdata-properties-apps-serializedinstalledapp.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/apps/items`
|
|
||||||
|
|
||||||
* [SerializedInstalledApp](./serverdatastatus-definitions-serializedinstalledapp.md) – `https://timelimit.io/ServerDataStatus#/definitions/SerializedInstalledApp`
|
* [SerializedInstalledApp](./serverdatastatus-definitions-serializedinstalledapp.md) – `https://timelimit.io/ServerDataStatus#/definitions/SerializedInstalledApp`
|
||||||
|
|
||||||
* [SerializedInstalledApp](./serverdatastatus-definitions-serverinstalledappsdata-properties-apps-serializedinstalledapp.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/apps/items`
|
|
||||||
|
|
||||||
* [SerializedMarkTaskPendingAction](./serializedapplogicaction-definitions-serializedmarktaskpendingaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedMarkTaskPendingAction`
|
* [SerializedMarkTaskPendingAction](./serializedapplogicaction-definitions-serializedmarktaskpendingaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedMarkTaskPendingAction`
|
||||||
|
|
||||||
* [SerializedMarkTaskPendingAction](./serializedapplogicaction-anyof-serializedmarktaskpendingaction.md) – `https://timelimit.io/SerializedAppLogicAction#/anyOf/4`
|
|
||||||
|
|
||||||
* [SerializedRemoveCategoryAppsAction](./serializedparentaction-anyof-serializedremovecategoryappsaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/11`
|
|
||||||
|
|
||||||
* [SerializedRemoveCategoryAppsAction](./serializedparentaction-definitions-serializedremovecategoryappsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedRemoveCategoryAppsAction`
|
* [SerializedRemoveCategoryAppsAction](./serializedparentaction-definitions-serializedremovecategoryappsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedRemoveCategoryAppsAction`
|
||||||
|
|
||||||
* [SerializedRemoveInstalledAppsAction](./serializedapplogicaction-definitions-serializedremoveinstalledappsaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedRemoveInstalledAppsAction`
|
* [SerializedRemoveInstalledAppsAction](./serializedapplogicaction-definitions-serializedremoveinstalledappsaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedRemoveInstalledAppsAction`
|
||||||
|
|
||||||
* [SerializedRemoveInstalledAppsAction](./serializedapplogicaction-anyof-serializedremoveinstalledappsaction.md) – `https://timelimit.io/SerializedAppLogicAction#/anyOf/5`
|
|
||||||
|
|
||||||
* [SerializedRemoveUserAction](./serializedparentaction-anyof-serializedremoveuseraction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/12`
|
|
||||||
|
|
||||||
* [SerializedRemoveUserAction](./serializedparentaction-definitions-serializedremoveuseraction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedRemoveUserAction`
|
* [SerializedRemoveUserAction](./serializedparentaction-definitions-serializedremoveuseraction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedRemoveUserAction`
|
||||||
|
|
||||||
* [SerializedRenameChildAction](./serializedparentaction-anyof-serializedrenamechildaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/13`
|
|
||||||
|
|
||||||
* [SerializedRenameChildAction](./serializedparentaction-definitions-serializedrenamechildaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedRenameChildAction`
|
* [SerializedRenameChildAction](./serializedparentaction-definitions-serializedrenamechildaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedRenameChildAction`
|
||||||
|
|
||||||
* [SerializedReviewChildTaskAction](./serializedparentaction-definitions-serializedreviewchildtaskaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction`
|
* [SerializedReviewChildTaskAction](./serializedparentaction-definitions-serializedreviewchildtaskaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction`
|
||||||
|
|
||||||
* [SerializedReviewChildTaskAction](./serializedparentaction-anyof-serializedreviewchildtaskaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/15`
|
|
||||||
|
|
||||||
* [SerializedSetCategoryExtraTimeAction](./serializedparentaction-anyof-serializedsetcategoryextratimeaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/16`
|
|
||||||
|
|
||||||
* [SerializedSetCategoryExtraTimeAction](./serializedparentaction-definitions-serializedsetcategoryextratimeaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction`
|
* [SerializedSetCategoryExtraTimeAction](./serializedparentaction-definitions-serializedsetcategoryextratimeaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction`
|
||||||
|
|
||||||
* [SerializedSetCategoryForUnassignedAppsAction](./serializedparentaction-anyof-serializedsetcategoryforunassignedappsaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/17`
|
|
||||||
|
|
||||||
* [SerializedSetCategoryForUnassignedAppsAction](./serializedparentaction-definitions-serializedsetcategoryforunassignedappsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryForUnassignedAppsAction`
|
* [SerializedSetCategoryForUnassignedAppsAction](./serializedparentaction-definitions-serializedsetcategoryforunassignedappsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryForUnassignedAppsAction`
|
||||||
|
|
||||||
* [SerializedSetChildPasswordAction](./serializedparentaction-definitions-serializedsetchildpasswordaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetChildPasswordAction`
|
* [SerializedSetChildPasswordAction](./serializedparentaction-definitions-serializedsetchildpasswordaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetChildPasswordAction`
|
||||||
|
|
||||||
* [SerializedSetChildPasswordAction](./serializedparentaction-anyof-serializedsetchildpasswordaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/18`
|
|
||||||
|
|
||||||
* [SerializedSetConsiderRebootManipulationAction](./serializedparentaction-anyof-serializedsetconsiderrebootmanipulationaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/19`
|
|
||||||
|
|
||||||
* [SerializedSetConsiderRebootManipulationAction](./serializedparentaction-definitions-serializedsetconsiderrebootmanipulationaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetConsiderRebootManipulationAction`
|
* [SerializedSetConsiderRebootManipulationAction](./serializedparentaction-definitions-serializedsetconsiderrebootmanipulationaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetConsiderRebootManipulationAction`
|
||||||
|
|
||||||
* [SerializedSetDeviceDefaultUserAction](./serializedparentaction-definitions-serializedsetdevicedefaultuseraction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetDeviceDefaultUserAction`
|
* [SerializedSetDeviceDefaultUserAction](./serializedparentaction-definitions-serializedsetdevicedefaultuseraction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetDeviceDefaultUserAction`
|
||||||
|
|
||||||
* [SerializedSetDeviceDefaultUserAction](./serializedparentaction-anyof-serializedsetdevicedefaultuseraction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/20`
|
|
||||||
|
|
||||||
* [SerializedSetDeviceDefaultUserTimeoutAction](./serializedparentaction-anyof-serializedsetdevicedefaultusertimeoutaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/21`
|
|
||||||
|
|
||||||
* [SerializedSetDeviceDefaultUserTimeoutAction](./serializedparentaction-definitions-serializedsetdevicedefaultusertimeoutaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetDeviceDefaultUserTimeoutAction`
|
* [SerializedSetDeviceDefaultUserTimeoutAction](./serializedparentaction-definitions-serializedsetdevicedefaultusertimeoutaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetDeviceDefaultUserTimeoutAction`
|
||||||
|
|
||||||
* [SerializedSetDeviceUserAction](./serializedparentaction-anyof-serializedsetdeviceuseraction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/22`
|
|
||||||
|
|
||||||
* [SerializedSetDeviceUserAction](./serializedparentaction-definitions-serializedsetdeviceuseraction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetDeviceUserAction`
|
* [SerializedSetDeviceUserAction](./serializedparentaction-definitions-serializedsetdeviceuseraction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetDeviceUserAction`
|
||||||
|
|
||||||
* [SerializedSetKeepSignedInAction](./serializedparentaction-definitions-serializedsetkeepsignedinaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetKeepSignedInAction`
|
* [SerializedSetKeepSignedInAction](./serializedparentaction-definitions-serializedsetkeepsignedinaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetKeepSignedInAction`
|
||||||
|
|
||||||
* [SerializedSetKeepSignedInAction](./serializedparentaction-anyof-serializedsetkeepsignedinaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/23`
|
|
||||||
|
|
||||||
* [SerializedSetParentCategoryAction](./serializedparentaction-definitions-serializedsetparentcategoryaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetParentCategoryAction`
|
* [SerializedSetParentCategoryAction](./serializedparentaction-definitions-serializedsetparentcategoryaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetParentCategoryAction`
|
||||||
|
|
||||||
* [SerializedSetParentCategoryAction](./serializedparentaction-anyof-serializedsetparentcategoryaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/24`
|
|
||||||
|
|
||||||
* [SerializedSetRelaxPrimaryDeviceAction](./serializedparentaction-anyof-serializedsetrelaxprimarydeviceaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/25`
|
|
||||||
|
|
||||||
* [SerializedSetRelaxPrimaryDeviceAction](./serializedparentaction-definitions-serializedsetrelaxprimarydeviceaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetRelaxPrimaryDeviceAction`
|
* [SerializedSetRelaxPrimaryDeviceAction](./serializedparentaction-definitions-serializedsetrelaxprimarydeviceaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetRelaxPrimaryDeviceAction`
|
||||||
|
|
||||||
* [SerializedSetSendDeviceConnected](./serializedparentaction-definitions-serializedsetsenddeviceconnected.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetSendDeviceConnected`
|
* [SerializedSetSendDeviceConnected](./serializedparentaction-definitions-serializedsetsenddeviceconnected.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetSendDeviceConnected`
|
||||||
|
|
||||||
* [SerializedSetSendDeviceConnected](./serializedparentaction-anyof-serializedsetsenddeviceconnected.md) – `https://timelimit.io/SerializedParentAction#/anyOf/26`
|
|
||||||
|
|
||||||
* [SerializedSetUserDisableLimitsUntilAction](./serializedparentaction-definitions-serializedsetuserdisablelimitsuntilaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetUserDisableLimitsUntilAction`
|
* [SerializedSetUserDisableLimitsUntilAction](./serializedparentaction-definitions-serializedsetuserdisablelimitsuntilaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetUserDisableLimitsUntilAction`
|
||||||
|
|
||||||
* [SerializedSetUserDisableLimitsUntilAction](./serializedparentaction-anyof-serializedsetuserdisablelimitsuntilaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/27`
|
|
||||||
|
|
||||||
* [SerializedSetUserTimezoneAction](./serializedparentaction-definitions-serializedsetusertimezoneaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetUserTimezoneAction`
|
* [SerializedSetUserTimezoneAction](./serializedparentaction-definitions-serializedsetusertimezoneaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetUserTimezoneAction`
|
||||||
|
|
||||||
* [SerializedSetUserTimezoneAction](./serializedparentaction-anyof-serializedsetusertimezoneaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/28`
|
|
||||||
|
|
||||||
* [SerializedSignOutAtDeviceAction](./serializedapplogicaction-definitions-serializedsignoutatdeviceaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSignOutAtDeviceAction`
|
* [SerializedSignOutAtDeviceAction](./serializedapplogicaction-definitions-serializedsignoutatdeviceaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSignOutAtDeviceAction`
|
||||||
|
|
||||||
* [SerializedSignOutAtDeviceAction](./serializedapplogicaction-anyof-serializedsignoutatdeviceaction.md) – `https://timelimit.io/SerializedAppLogicAction#/anyOf/6`
|
|
||||||
|
|
||||||
* [SerializedTimeLimitRule](./serializedparentaction-definitions-serializedcreatetimelimtruleaction-properties-serializedtimelimitrule.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedCreateTimelimtRuleAction/properties/rule`
|
|
||||||
|
|
||||||
* [SerializedTimeLimitRule](./serializedparentaction-definitions-serializedcreatetimelimtruleaction-properties-serializedtimelimitrule.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedCreateTimelimtRuleAction/properties/rule`
|
|
||||||
|
|
||||||
* [SerializedTimeLimitRule](./serializedparentaction-definitions-serializedtimelimitrule.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedTimeLimitRule`
|
* [SerializedTimeLimitRule](./serializedparentaction-definitions-serializedtimelimitrule.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedTimeLimitRule`
|
||||||
|
|
||||||
* [SerializedUpdatCategoryDisableLimitsAction](./serializedparentaction-definitions-serializedupdatcategorydisablelimitsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdatCategoryDisableLimitsAction`
|
* [SerializedUpdatCategoryDisableLimitsAction](./serializedparentaction-definitions-serializedupdatcategorydisablelimitsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdatCategoryDisableLimitsAction`
|
||||||
|
|
||||||
* [SerializedUpdatCategoryDisableLimitsAction](./serializedparentaction-anyof-serializedupdatcategorydisablelimitsaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/32`
|
|
||||||
|
|
||||||
* [SerializedUpdateAppActivitiesAction](./serializedapplogicaction-anyof-serializedupdateappactivitiesaction.md) – `https://timelimit.io/SerializedAppLogicAction#/anyOf/8`
|
|
||||||
|
|
||||||
* [SerializedUpdateAppActivitiesAction](./serializedapplogicaction-definitions-serializedupdateappactivitiesaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction`
|
* [SerializedUpdateAppActivitiesAction](./serializedapplogicaction-definitions-serializedupdateappactivitiesaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction`
|
||||||
|
|
||||||
* [SerializedUpdateCategoryBatteryLimitAction](./serializedparentaction-anyof-serializedupdatecategorybatterylimitaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/29`
|
|
||||||
|
|
||||||
* [SerializedUpdateCategoryBatteryLimitAction](./serializedparentaction-definitions-serializedupdatecategorybatterylimitaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBatteryLimitAction`
|
* [SerializedUpdateCategoryBatteryLimitAction](./serializedparentaction-definitions-serializedupdatecategorybatterylimitaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBatteryLimitAction`
|
||||||
|
|
||||||
* [SerializedUpdateCategoryBlockAllNotificationsAction](./serializedparentaction-anyof-serializedupdatecategoryblockallnotificationsaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/30`
|
|
||||||
|
|
||||||
* [SerializedUpdateCategoryBlockAllNotificationsAction](./serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction`
|
* [SerializedUpdateCategoryBlockAllNotificationsAction](./serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction`
|
||||||
|
|
||||||
* [SerializedUpdateCategoryBlockedTimesAction](./serializedparentaction-definitions-serializedupdatecategoryblockedtimesaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockedTimesAction`
|
* [SerializedUpdateCategoryBlockedTimesAction](./serializedparentaction-definitions-serializedupdatecategoryblockedtimesaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockedTimesAction`
|
||||||
|
|
||||||
* [SerializedUpdateCategoryBlockedTimesAction](./serializedparentaction-anyof-serializedupdatecategoryblockedtimesaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/31`
|
|
||||||
|
|
||||||
* [SerializedUpdateCategoryFlagsAction](./serializedparentaction-anyof-serializedupdatecategoryflagsaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/33`
|
|
||||||
|
|
||||||
* [SerializedUpdateCategoryFlagsAction](./serializedparentaction-definitions-serializedupdatecategoryflagsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryFlagsAction`
|
* [SerializedUpdateCategoryFlagsAction](./serializedparentaction-definitions-serializedupdatecategoryflagsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryFlagsAction`
|
||||||
|
|
||||||
* [SerializedUpdateCategorySortingAction](./serializedparentaction-anyof-serializedupdatecategorysortingaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/34`
|
|
||||||
|
|
||||||
* [SerializedUpdateCategorySortingAction](./serializedparentaction-definitions-serializedupdatecategorysortingaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategorySortingAction`
|
* [SerializedUpdateCategorySortingAction](./serializedparentaction-definitions-serializedupdatecategorysortingaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategorySortingAction`
|
||||||
|
|
||||||
* [SerializedUpdateCategoryTemporarilyBlockedAction](./serializedparentaction-anyof-serializedupdatecategorytemporarilyblockedaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/35`
|
|
||||||
|
|
||||||
* [SerializedUpdateCategoryTemporarilyBlockedAction](./serializedparentaction-definitions-serializedupdatecategorytemporarilyblockedaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryTemporarilyBlockedAction`
|
* [SerializedUpdateCategoryTemporarilyBlockedAction](./serializedparentaction-definitions-serializedupdatecategorytemporarilyblockedaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryTemporarilyBlockedAction`
|
||||||
|
|
||||||
* [SerializedUpdateCategoryTimeWarningsAction](./serializedparentaction-anyof-serializedupdatecategorytimewarningsaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/36`
|
|
||||||
|
|
||||||
* [SerializedUpdateCategoryTimeWarningsAction](./serializedparentaction-definitions-serializedupdatecategorytimewarningsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryTimeWarningsAction`
|
* [SerializedUpdateCategoryTimeWarningsAction](./serializedparentaction-definitions-serializedupdatecategorytimewarningsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryTimeWarningsAction`
|
||||||
|
|
||||||
* [SerializedUpdateCategoryTitleAction](./serializedparentaction-anyof-serializedupdatecategorytitleaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/37`
|
|
||||||
|
|
||||||
* [SerializedUpdateCategoryTitleAction](./serializedparentaction-definitions-serializedupdatecategorytitleaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryTitleAction`
|
* [SerializedUpdateCategoryTitleAction](./serializedparentaction-definitions-serializedupdatecategorytitleaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryTitleAction`
|
||||||
|
|
||||||
* [SerializedUpdateChildTaskAction](./serializedparentaction-definitions-serializedupdatechildtaskaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateChildTaskAction`
|
* [SerializedUpdateChildTaskAction](./serializedparentaction-definitions-serializedupdatechildtaskaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateChildTaskAction`
|
||||||
|
|
||||||
* [SerializedUpdateChildTaskAction](./serializedparentaction-anyof-serializedupdatechildtaskaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/38`
|
|
||||||
|
|
||||||
* [SerializedUpdateDeviceNameAction](./serializedparentaction-anyof-serializedupdatedevicenameaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/39`
|
|
||||||
|
|
||||||
* [SerializedUpdateDeviceNameAction](./serializedparentaction-definitions-serializedupdatedevicenameaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateDeviceNameAction`
|
* [SerializedUpdateDeviceNameAction](./serializedparentaction-definitions-serializedupdatedevicenameaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateDeviceNameAction`
|
||||||
|
|
||||||
* [SerializedUpdateDeviceStatusAction](./serializedapplogicaction-anyof-serializedupdatedevicestatusaction.md) – `https://timelimit.io/SerializedAppLogicAction#/anyOf/9`
|
|
||||||
|
|
||||||
* [SerializedUpdateDeviceStatusAction](./serializedapplogicaction-definitions-serializedupdatedevicestatusaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction`
|
* [SerializedUpdateDeviceStatusAction](./serializedapplogicaction-definitions-serializedupdatedevicestatusaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction`
|
||||||
|
|
||||||
* [SerializedUpdateEnableActivityLevelBlockingAction](./serializedparentaction-anyof-serializedupdateenableactivitylevelblockingaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/40`
|
|
||||||
|
|
||||||
* [SerializedUpdateEnableActivityLevelBlockingAction](./serializedparentaction-definitions-serializedupdateenableactivitylevelblockingaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateEnableActivityLevelBlockingAction`
|
* [SerializedUpdateEnableActivityLevelBlockingAction](./serializedparentaction-definitions-serializedupdateenableactivitylevelblockingaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateEnableActivityLevelBlockingAction`
|
||||||
|
|
||||||
* [SerializedUpdateParentNotificationFlagsAction](./serializedparentaction-anyof-serializedupdateparentnotificationflagsaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/42`
|
|
||||||
|
|
||||||
* [SerializedUpdateParentNotificationFlagsAction](./serializedparentaction-definitions-serializedupdateparentnotificationflagsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateParentNotificationFlagsAction`
|
* [SerializedUpdateParentNotificationFlagsAction](./serializedparentaction-definitions-serializedupdateparentnotificationflagsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateParentNotificationFlagsAction`
|
||||||
|
|
||||||
* [SerializedUpdateTimelimitRuleAction](./serializedparentaction-anyof-serializedupdatetimelimitruleaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/43`
|
|
||||||
|
|
||||||
* [SerializedUpdateTimelimitRuleAction](./serializedparentaction-definitions-serializedupdatetimelimitruleaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateTimelimitRuleAction`
|
* [SerializedUpdateTimelimitRuleAction](./serializedparentaction-definitions-serializedupdatetimelimitruleaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateTimelimitRuleAction`
|
||||||
|
|
||||||
* [SerializedUpdateUserFlagsAction](./serializedparentaction-anyof-serializedupdateuserflagsaction.md) – `https://timelimit.io/SerializedParentAction#/anyOf/44`
|
|
||||||
|
|
||||||
* [SerializedUpdateUserFlagsAction](./serializedparentaction-definitions-serializedupdateuserflagsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateUserFlagsAction`
|
* [SerializedUpdateUserFlagsAction](./serializedparentaction-definitions-serializedupdateuserflagsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateUserFlagsAction`
|
||||||
|
|
||||||
* [SerializedUpdateUserLimitLoginCategory](./serializedparentaction-anyof-serializedupdateuserlimitlogincategory.md) – `https://timelimit.io/SerializedParentAction#/anyOf/45`
|
|
||||||
|
|
||||||
* [SerializedUpdateUserLimitLoginCategory](./serializedparentaction-definitions-serializedupdateuserlimitlogincategory.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateUserLimitLoginCategory`
|
* [SerializedUpdateUserLimitLoginCategory](./serializedparentaction-definitions-serializedupdateuserlimitlogincategory.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateUserLimitLoginCategory`
|
||||||
|
|
||||||
* [SerializedUpdateUserLimitLoginPreBlockDuration](./serializedparentaction-anyof-serializedupdateuserlimitloginpreblockduration.md) – `https://timelimit.io/SerializedParentAction#/anyOf/46`
|
|
||||||
|
|
||||||
* [SerializedUpdateUserLimitLoginPreBlockDuration](./serializedparentaction-definitions-serializedupdateuserlimitloginpreblockduration.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateUserLimitLoginPreBlockDuration`
|
* [SerializedUpdateUserLimitLoginPreBlockDuration](./serializedparentaction-definitions-serializedupdateuserlimitloginpreblockduration.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateUserLimitLoginPreBlockDuration`
|
||||||
|
|
||||||
* [ServerCategoryNetworkId](./serverdatastatus-definitions-serverupdatedcategorybasedata-properties-networks-servercategorynetworkid.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/networks/items`
|
|
||||||
|
|
||||||
* [ServerCategoryNetworkId](./serverdatastatus-definitions-servercategorynetworkid.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerCategoryNetworkId`
|
* [ServerCategoryNetworkId](./serverdatastatus-definitions-servercategorynetworkid.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerCategoryNetworkId`
|
||||||
|
|
||||||
* [ServerCategoryNetworkId](./serverdatastatus-definitions-serverupdatedcategorybasedata-properties-networks-servercategorynetworkid.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/networks/items`
|
|
||||||
|
|
||||||
* [ServerDeviceData](./serverdatastatus-definitions-serverdevicelist-properties-data-serverdevicedata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceList/properties/data/items`
|
|
||||||
|
|
||||||
* [ServerDeviceData](./serverdatastatus-definitions-serverdevicedata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData`
|
* [ServerDeviceData](./serverdatastatus-definitions-serverdevicedata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData`
|
||||||
|
|
||||||
* [ServerDeviceData](./serverdatastatus-definitions-serverdevicelist-properties-data-serverdevicedata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceList/properties/data/items`
|
|
||||||
|
|
||||||
* [ServerDeviceList](./serverdatastatus-properties-serverdevicelist.md) – `https://timelimit.io/ServerDataStatus#/properties/devices`
|
|
||||||
|
|
||||||
* [ServerDeviceList](./serverdatastatus-definitions-serverdevicelist.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceList`
|
* [ServerDeviceList](./serverdatastatus-definitions-serverdevicelist.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceList`
|
||||||
|
|
||||||
* [ServerInstalledAppsData](./serverdatastatus-definitions-serverinstalledappsdata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData`
|
* [ServerInstalledAppsData](./serverdatastatus-definitions-serverinstalledappsdata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData`
|
||||||
|
|
||||||
* [ServerInstalledAppsData](./serverdatastatus-properties-apps-serverinstalledappsdata.md) – `https://timelimit.io/ServerDataStatus#/properties/apps/items`
|
|
||||||
|
|
||||||
* [ServerSessionDurationItem](./serverdatastatus-definitions-serverupdatedcategoryusedtimes-properties-sessiondurations-serversessiondurationitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes/properties/sessionDurations/items`
|
|
||||||
|
|
||||||
* [ServerSessionDurationItem](./serverdatastatus-definitions-serversessiondurationitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerSessionDurationItem`
|
* [ServerSessionDurationItem](./serverdatastatus-definitions-serversessiondurationitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerSessionDurationItem`
|
||||||
|
|
||||||
* [ServerSessionDurationItem](./serverdatastatus-definitions-serverupdatedcategoryusedtimes-properties-sessiondurations-serversessiondurationitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes/properties/sessionDurations/items`
|
|
||||||
|
|
||||||
* [ServerTimeLimitRule](./serverdatastatus-definitions-serverupdatedtimelimitrules-properties-rules-servertimelimitrule.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedTimeLimitRules/properties/rules/items`
|
|
||||||
|
|
||||||
* [ServerTimeLimitRule](./serverdatastatus-definitions-servertimelimitrule.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerTimeLimitRule`
|
* [ServerTimeLimitRule](./serverdatastatus-definitions-servertimelimitrule.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerTimeLimitRule`
|
||||||
|
|
||||||
* [ServerTimeLimitRule](./serverdatastatus-definitions-serverupdatedtimelimitrules-properties-rules-servertimelimitrule.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedTimeLimitRules/properties/rules/items`
|
|
||||||
|
|
||||||
* [ServerUpdatedCategoryAssignedApps](./serverdatastatus-definitions-serverupdatedcategoryassignedapps.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryAssignedApps`
|
* [ServerUpdatedCategoryAssignedApps](./serverdatastatus-definitions-serverupdatedcategoryassignedapps.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryAssignedApps`
|
||||||
|
|
||||||
* [ServerUpdatedCategoryAssignedApps](./serverdatastatus-properties-categoryapp-serverupdatedcategoryassignedapps.md) – `https://timelimit.io/ServerDataStatus#/properties/categoryApp/items`
|
|
||||||
|
|
||||||
* [ServerUpdatedCategoryBaseData](./serverdatastatus-definitions-serverupdatedcategorybasedata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData`
|
* [ServerUpdatedCategoryBaseData](./serverdatastatus-definitions-serverupdatedcategorybasedata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData`
|
||||||
|
|
||||||
* [ServerUpdatedCategoryBaseData](./serverdatastatus-properties-categorybase-serverupdatedcategorybasedata.md) – `https://timelimit.io/ServerDataStatus#/properties/categoryBase/items`
|
|
||||||
|
|
||||||
* [ServerUpdatedCategoryTask](./serverdatastatus-definitions-serverupdatedcategorytasks-properties-tasks-serverupdatedcategorytask.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTasks/properties/tasks/items`
|
|
||||||
|
|
||||||
* [ServerUpdatedCategoryTask](./serverdatastatus-definitions-serverupdatedcategorytask.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTask`
|
* [ServerUpdatedCategoryTask](./serverdatastatus-definitions-serverupdatedcategorytask.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTask`
|
||||||
|
|
||||||
* [ServerUpdatedCategoryTask](./serverdatastatus-definitions-serverupdatedcategorytasks-properties-tasks-serverupdatedcategorytask.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTasks/properties/tasks/items`
|
|
||||||
|
|
||||||
* [ServerUpdatedCategoryTasks](./serverdatastatus-definitions-serverupdatedcategorytasks.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTasks`
|
* [ServerUpdatedCategoryTasks](./serverdatastatus-definitions-serverupdatedcategorytasks.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTasks`
|
||||||
|
|
||||||
* [ServerUpdatedCategoryTasks](./serverdatastatus-properties-tasks-serverupdatedcategorytasks.md) – `https://timelimit.io/ServerDataStatus#/properties/tasks/items`
|
|
||||||
|
|
||||||
* [ServerUpdatedCategoryUsedTimes](./serverdatastatus-properties-usedtimes-serverupdatedcategoryusedtimes.md) – `https://timelimit.io/ServerDataStatus#/properties/usedTimes/items`
|
|
||||||
|
|
||||||
* [ServerUpdatedCategoryUsedTimes](./serverdatastatus-definitions-serverupdatedcategoryusedtimes.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes`
|
* [ServerUpdatedCategoryUsedTimes](./serverdatastatus-definitions-serverupdatedcategoryusedtimes.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes`
|
||||||
|
|
||||||
* [ServerUpdatedTimeLimitRules](./serverdatastatus-definitions-serverupdatedtimelimitrules.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedTimeLimitRules`
|
* [ServerUpdatedTimeLimitRules](./serverdatastatus-definitions-serverupdatedtimelimitrules.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedTimeLimitRules`
|
||||||
|
|
||||||
* [ServerUpdatedTimeLimitRules](./serverdatastatus-properties-rules-serverupdatedtimelimitrules.md) – `https://timelimit.io/ServerDataStatus#/properties/rules/items`
|
|
||||||
|
|
||||||
* [ServerUsedTimeItem](./serverdatastatus-definitions-serverupdatedcategoryusedtimes-properties-times-serverusedtimeitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes/properties/times/items`
|
|
||||||
|
|
||||||
* [ServerUsedTimeItem](./serverdatastatus-definitions-serverusedtimeitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUsedTimeItem`
|
* [ServerUsedTimeItem](./serverdatastatus-definitions-serverusedtimeitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUsedTimeItem`
|
||||||
|
|
||||||
* [ServerUsedTimeItem](./serverdatastatus-definitions-serverupdatedcategoryusedtimes-properties-times-serverusedtimeitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes/properties/times/items`
|
|
||||||
|
|
||||||
* [ServerUserEntry](./serverdatastatus-definitions-serveruserentry.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUserEntry`
|
* [ServerUserEntry](./serverdatastatus-definitions-serveruserentry.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUserEntry`
|
||||||
|
|
||||||
* [ServerUserEntry](./serverdatastatus-definitions-serveruserlist-properties-data-serveruserentry.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUserList/properties/data/items`
|
|
||||||
|
|
||||||
* [ServerUserEntry](./serverdatastatus-definitions-serveruserlist-properties-data-serveruserentry.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUserList/properties/data/items`
|
|
||||||
|
|
||||||
* [ServerUserList](./serverdatastatus-definitions-serveruserlist.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUserList`
|
* [ServerUserList](./serverdatastatus-definitions-serveruserlist.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUserList`
|
||||||
|
|
||||||
* [ServerUserList](./serverdatastatus-properties-serveruserlist.md) – `https://timelimit.io/ServerDataStatus#/properties/users`
|
|
||||||
|
|
||||||
* [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-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-categories.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/categories`
|
||||||
|
|
||||||
* [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-apps.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/apps`
|
* [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 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`
|
||||||
|
|
||||||
* [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`
|
||||||
@@ -456,6 +244,8 @@
|
|||||||
|
|
||||||
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddinstalledappsaction-properties-apps.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddInstalledAppsAction/properties/apps`
|
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddinstalledappsaction-properties-apps.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddInstalledAppsAction/properties/apps`
|
||||||
|
|
||||||
|
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i`
|
||||||
|
|
||||||
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/as`
|
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/as`
|
||||||
|
|
||||||
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/as/items`
|
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/as/items`
|
||||||
@@ -478,7 +268,7 @@
|
|||||||
|
|
||||||
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/as`
|
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/as`
|
||||||
|
|
||||||
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i`
|
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/as/items`
|
||||||
|
|
||||||
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/sdl`
|
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/sdl`
|
||||||
|
|
||||||
@@ -492,8 +282,6 @@
|
|||||||
|
|
||||||
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-updatedoradded.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/updatedOrAdded`
|
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-updatedoradded.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/updatedOrAdded`
|
||||||
|
|
||||||
* [Untitled array in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/as/items`
|
|
||||||
|
|
||||||
* [Untitled array in SerializedParentAction](./serializedparentaction-definitions-serializedaddcategoryappsaction-properties-packagenames.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedAddCategoryAppsAction/properties/packageNames`
|
* [Untitled array in SerializedParentAction](./serializedparentaction-definitions-serializedaddcategoryappsaction-properties-packagenames.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedAddCategoryAppsAction/properties/packageNames`
|
||||||
|
|
||||||
* [Untitled array in SerializedParentAction](./serializedparentaction-definitions-serializedremovecategoryappsaction-properties-packagenames.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedRemoveCategoryAppsAction/properties/packageNames`
|
* [Untitled array in SerializedParentAction](./serializedparentaction-definitions-serializedremovecategoryappsaction-properties-packagenames.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedRemoveCategoryAppsAction/properties/packageNames`
|
||||||
@@ -506,7 +294,7 @@
|
|||||||
|
|
||||||
* [Untitled array in SerializedParentAction](./serializedparentaction-definitions-serializedupdatecategorysortingaction-properties-categoryids.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategorySortingAction/properties/categoryIds`
|
* [Untitled array in SerializedParentAction](./serializedparentaction-definitions-serializedupdatecategorysortingaction-properties-categoryids.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategorySortingAction/properties/categoryIds`
|
||||||
|
|
||||||
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serveruserlist-properties-data.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUserList/properties/data`
|
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serverdevicelist-properties-data.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceList/properties/data`
|
||||||
|
|
||||||
* [Untitled array in ServerDataStatus](./serverdatastatus-properties-apps.md) – `https://timelimit.io/ServerDataStatus#/properties/apps`
|
* [Untitled array in ServerDataStatus](./serverdatastatus-properties-apps.md) – `https://timelimit.io/ServerDataStatus#/properties/apps`
|
||||||
|
|
||||||
@@ -558,7 +346,7 @@
|
|||||||
|
|
||||||
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serverupdatedcategorytasks-properties-tasks.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTasks/properties/tasks`
|
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serverupdatedcategorytasks-properties-tasks.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTasks/properties/tasks`
|
||||||
|
|
||||||
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serverdevicelist-properties-data.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceList/properties/data`
|
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serveruserlist-properties-data.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUserList/properties/data`
|
||||||
|
|
||||||
## Version Note
|
## Version Note
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
},
|
},
|
||||||
"locale": {
|
"locale": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
},
|
||||||
|
"deviceAuthToken": {
|
||||||
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
|||||||
@@ -160,16 +160,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"additionalItems": {
|
"maxItems": 2
|
||||||
"anyOf": [
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sdl": {
|
"sdl": {
|
||||||
@@ -191,22 +182,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"minItems": 4,
|
"minItems": 4,
|
||||||
"additionalItems": {
|
"maxItems": 4
|
||||||
"anyOf": [
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -343,16 +319,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"additionalItems": {
|
"maxItems": 2
|
||||||
"anyOf": [
|
|
||||||
{
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"updatedOrAdded": {
|
"updatedOrAdded": {
|
||||||
|
|||||||
@@ -640,6 +640,9 @@
|
|||||||
},
|
},
|
||||||
"time": {
|
"time": {
|
||||||
"type": "number"
|
"type": "number"
|
||||||
|
},
|
||||||
|
"day": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@@ -1006,6 +1009,9 @@
|
|||||||
},
|
},
|
||||||
"blocked": {
|
"blocked": {
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"blockDelay": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
|||||||
@@ -54,10 +54,14 @@
|
|||||||
},
|
},
|
||||||
"message": {
|
"message": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
},
|
||||||
|
"apiLevel": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": [
|
"required": [
|
||||||
|
"apiLevel",
|
||||||
"fullVersion"
|
"fullVersion"
|
||||||
],
|
],
|
||||||
"definitions": {
|
"definitions": {
|
||||||
@@ -388,11 +392,15 @@
|
|||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"type": "number"
|
"type": "number"
|
||||||
|
},
|
||||||
|
"blockNotificationDelay": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": [
|
"required": [
|
||||||
"blockAllNotifications",
|
"blockAllNotifications",
|
||||||
|
"blockNotificationDelay",
|
||||||
"blockedTimes",
|
"blockedTimes",
|
||||||
"categoryId",
|
"categoryId",
|
||||||
"childId",
|
"childId",
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# Untitled string in SendMailLoginCodeRequest Schema
|
||||||
|
|
||||||
|
```txt
|
||||||
|
https://timelimit.io/SendMailLoginCodeRequest#/properties/deviceAuthToken
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
|
||||||
|
| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :--------------------------------------------------------------------------------------------------- |
|
||||||
|
| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [SendMailLoginCodeRequest.schema.json*](SendMailLoginCodeRequest.schema.json "open original schema") |
|
||||||
|
|
||||||
|
## deviceAuthToken Type
|
||||||
|
|
||||||
|
`string`
|
||||||
@@ -16,10 +16,11 @@ https://timelimit.io/SendMailLoginCodeRequest
|
|||||||
|
|
||||||
# SendMailLoginCodeRequest Properties
|
# SendMailLoginCodeRequest Properties
|
||||||
|
|
||||||
| Property | Type | Required | Nullable | Defined by |
|
| Property | Type | Required | Nullable | Defined by |
|
||||||
| :---------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------- |
|
| :---------------------------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| [mail](#mail) | `string` | Required | cannot be null | [SendMailLoginCodeRequest](sendmaillogincoderequest-properties-mail.md "https://timelimit.io/SendMailLoginCodeRequest#/properties/mail") |
|
| [mail](#mail) | `string` | Required | cannot be null | [SendMailLoginCodeRequest](sendmaillogincoderequest-properties-mail.md "https://timelimit.io/SendMailLoginCodeRequest#/properties/mail") |
|
||||||
| [locale](#locale) | `string` | Required | cannot be null | [SendMailLoginCodeRequest](sendmaillogincoderequest-properties-locale.md "https://timelimit.io/SendMailLoginCodeRequest#/properties/locale") |
|
| [locale](#locale) | `string` | Required | cannot be null | [SendMailLoginCodeRequest](sendmaillogincoderequest-properties-locale.md "https://timelimit.io/SendMailLoginCodeRequest#/properties/locale") |
|
||||||
|
| [deviceAuthToken](#deviceauthtoken) | `string` | Optional | cannot be null | [SendMailLoginCodeRequest](sendmaillogincoderequest-properties-deviceauthtoken.md "https://timelimit.io/SendMailLoginCodeRequest#/properties/deviceAuthToken") |
|
||||||
|
|
||||||
## mail
|
## mail
|
||||||
|
|
||||||
@@ -57,4 +58,22 @@ https://timelimit.io/SendMailLoginCodeRequest
|
|||||||
|
|
||||||
`string`
|
`string`
|
||||||
|
|
||||||
|
## deviceAuthToken
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`deviceAuthToken`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `string`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [SendMailLoginCodeRequest](sendmaillogincoderequest-properties-deviceauthtoken.md "https://timelimit.io/SendMailLoginCodeRequest#/properties/deviceAuthToken")
|
||||||
|
|
||||||
|
### deviceAuthToken Type
|
||||||
|
|
||||||
|
`string`
|
||||||
|
|
||||||
# SendMailLoginCodeRequest Definitions
|
# SendMailLoginCodeRequest Definitions
|
||||||
|
|||||||
+2
-2
@@ -18,8 +18,8 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
|
|
||||||
2. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-items-1.md "check type definition")
|
2. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-items-1.md "check type definition")
|
||||||
|
|
||||||
3. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-additionalitems.md "check type definition")
|
|
||||||
|
|
||||||
## items Constraints
|
## items Constraints
|
||||||
|
|
||||||
|
**maximum number of items**: the maximum number of items for this array is: `2`
|
||||||
|
|
||||||
**minimum number of items**: the minimum number of items for this array is: `2`
|
**minimum number of items**: the minimum number of items for this array is: `2`
|
||||||
|
|||||||
-2
@@ -17,5 +17,3 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
1. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-items-0.md "check type definition")
|
1. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-items-0.md "check type definition")
|
||||||
|
|
||||||
2. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-items-1.md "check type definition")
|
2. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-items-1.md "check type definition")
|
||||||
|
|
||||||
3. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-additionalitems.md "check type definition")
|
|
||||||
|
|||||||
+2
-2
@@ -22,8 +22,8 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
|
|
||||||
4. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-3.md "check type definition")
|
4. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-3.md "check type definition")
|
||||||
|
|
||||||
5. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-additionalitems.md "check type definition")
|
|
||||||
|
|
||||||
## items Constraints
|
## items Constraints
|
||||||
|
|
||||||
|
**maximum number of items**: the maximum number of items for this array is: `4`
|
||||||
|
|
||||||
**minimum number of items**: the minimum number of items for this array is: `4`
|
**minimum number of items**: the minimum number of items for this array is: `4`
|
||||||
|
|||||||
-2
@@ -21,5 +21,3 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
3. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-2.md "check type definition")
|
3. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-2.md "check type definition")
|
||||||
|
|
||||||
4. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-3.md "check type definition")
|
4. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-3.md "check type definition")
|
||||||
|
|
||||||
5. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-additionalitems.md "check type definition")
|
|
||||||
|
|||||||
-8
@@ -92,8 +92,6 @@ https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTime
|
|||||||
|
|
||||||
2. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-items-1.md "check type definition")
|
2. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-items-1.md "check type definition")
|
||||||
|
|
||||||
3. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-additionalitems.md "check type definition")
|
|
||||||
|
|
||||||
* cannot be null
|
* cannot be null
|
||||||
|
|
||||||
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/as")
|
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/as")
|
||||||
@@ -106,8 +104,6 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
|
|
||||||
2. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-items-1.md "check type definition")
|
2. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-items-1.md "check type definition")
|
||||||
|
|
||||||
3. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-as-items-additionalitems.md "check type definition")
|
|
||||||
|
|
||||||
## sdl
|
## sdl
|
||||||
|
|
||||||
|
|
||||||
@@ -126,8 +122,6 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
|
|
||||||
4. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-3.md "check type definition")
|
4. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-3.md "check type definition")
|
||||||
|
|
||||||
5. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-additionalitems.md "check type definition")
|
|
||||||
|
|
||||||
* cannot be null
|
* cannot be null
|
||||||
|
|
||||||
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/sdl")
|
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items/properties/sdl")
|
||||||
@@ -143,5 +137,3 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
3. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-2.md "check type definition")
|
3. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-2.md "check type definition")
|
||||||
|
|
||||||
4. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-3.md "check type definition")
|
4. [Untitled number in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-items-3.md "check type definition")
|
||||||
|
|
||||||
5. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items-properties-sdl-items-additionalitems.md "check type definition")
|
|
||||||
|
|||||||
+2
-2
@@ -18,8 +18,8 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
|
|
||||||
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
||||||
|
|
||||||
3. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-additionalitems.md "check type definition")
|
|
||||||
|
|
||||||
## items Constraints
|
## items Constraints
|
||||||
|
|
||||||
|
**maximum number of items**: the maximum number of items for this array is: `2`
|
||||||
|
|
||||||
**minimum number of items**: the minimum number of items for this array is: `2`
|
**minimum number of items**: the minimum number of items for this array is: `2`
|
||||||
|
|||||||
-2
@@ -17,5 +17,3 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
1. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-0.md "check type definition")
|
1. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-0.md "check type definition")
|
||||||
|
|
||||||
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
||||||
|
|
||||||
3. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-additionalitems.md "check type definition")
|
|
||||||
|
|||||||
-4
@@ -62,8 +62,6 @@ https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppAc
|
|||||||
|
|
||||||
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
||||||
|
|
||||||
3. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-additionalitems.md "check type definition")
|
|
||||||
|
|
||||||
* cannot be null
|
* cannot be null
|
||||||
|
|
||||||
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/removed")
|
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/removed")
|
||||||
@@ -76,8 +74,6 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
|
|
||||||
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
||||||
|
|
||||||
3. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-additionalitems.md "check type definition")
|
|
||||||
|
|
||||||
## updatedOrAdded
|
## updatedOrAdded
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -694,8 +694,6 @@ Reference this group by using
|
|||||||
|
|
||||||
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
||||||
|
|
||||||
3. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-additionalitems.md "check type definition")
|
|
||||||
|
|
||||||
* cannot be null
|
* cannot be null
|
||||||
|
|
||||||
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/removed")
|
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/removed")
|
||||||
@@ -708,8 +706,6 @@ an array where each item follows the corresponding schema in the following list:
|
|||||||
|
|
||||||
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
2. [Untitled string in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-items-1.md "check type definition")
|
||||||
|
|
||||||
3. and all following items must follow the schema: [Untitled undefined type in SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed-items-additionalitems.md "check type definition")
|
|
||||||
|
|
||||||
### updatedOrAdded
|
### updatedOrAdded
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
# Untitled number in SerializedParentAction Schema
|
||||||
|
|
||||||
|
```txt
|
||||||
|
https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/day
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
|
||||||
|
| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :----------------------------------------------------------------------------------------------- |
|
||||||
|
| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [SerializedParentAction.schema.json*](SerializedParentAction.schema.json "open original schema") |
|
||||||
|
|
||||||
|
## day Type
|
||||||
|
|
||||||
|
`number`
|
||||||
@@ -22,6 +22,7 @@ https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTa
|
|||||||
| [taskId](#taskid) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-taskid.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/taskId") |
|
| [taskId](#taskid) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-taskid.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/taskId") |
|
||||||
| [ok](#ok) | `boolean` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-ok.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/ok") |
|
| [ok](#ok) | `boolean` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-ok.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/ok") |
|
||||||
| [time](#time) | `number` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-time.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/time") |
|
| [time](#time) | `number` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-time.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/time") |
|
||||||
|
| [day](#day) | `number` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-day.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/day") |
|
||||||
|
|
||||||
## type
|
## type
|
||||||
|
|
||||||
@@ -102,3 +103,21 @@ https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTa
|
|||||||
### time Type
|
### time Type
|
||||||
|
|
||||||
`number`
|
`number`
|
||||||
|
|
||||||
|
## day
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`day`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-day.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/day")
|
||||||
|
|
||||||
|
### day Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
# Untitled number in SerializedParentAction Schema
|
||||||
|
|
||||||
|
```txt
|
||||||
|
https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/blockDelay
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
|
||||||
|
| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :----------------------------------------------------------------------------------------------- |
|
||||||
|
| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [SerializedParentAction.schema.json*](SerializedParentAction.schema.json "open original schema") |
|
||||||
|
|
||||||
|
## blockDelay Type
|
||||||
|
|
||||||
|
`number`
|
||||||
+19
@@ -21,6 +21,7 @@ https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategor
|
|||||||
| [type](#type) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-type.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/type") |
|
| [type](#type) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-type.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/type") |
|
||||||
| [categoryId](#categoryid) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-categoryid.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/categoryId") |
|
| [categoryId](#categoryid) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-categoryid.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/categoryId") |
|
||||||
| [blocked](#blocked) | `boolean` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-blocked.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/blocked") |
|
| [blocked](#blocked) | `boolean` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-blocked.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/blocked") |
|
||||||
|
| [blockDelay](#blockdelay) | `number` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-blockdelay.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/blockDelay") |
|
||||||
|
|
||||||
## type
|
## type
|
||||||
|
|
||||||
@@ -83,3 +84,21 @@ https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategor
|
|||||||
### blocked Type
|
### blocked Type
|
||||||
|
|
||||||
`boolean`
|
`boolean`
|
||||||
|
|
||||||
|
## blockDelay
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`blockDelay`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-blockdelay.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/blockDelay")
|
||||||
|
|
||||||
|
### blockDelay Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|||||||
@@ -1791,6 +1791,7 @@ Reference this group by using
|
|||||||
| [taskId](#taskid-1) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-taskid.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/taskId") |
|
| [taskId](#taskid-1) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-taskid.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/taskId") |
|
||||||
| [ok](#ok) | `boolean` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-ok.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/ok") |
|
| [ok](#ok) | `boolean` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-ok.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/ok") |
|
||||||
| [time](#time-1) | `number` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-time.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/time") |
|
| [time](#time-1) | `number` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-time.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/time") |
|
||||||
|
| [day](#day-1) | `number` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-day.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/day") |
|
||||||
|
|
||||||
### type
|
### type
|
||||||
|
|
||||||
@@ -1872,6 +1873,24 @@ Reference this group by using
|
|||||||
|
|
||||||
`number`
|
`number`
|
||||||
|
|
||||||
|
### day
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`day`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [SerializedParentAction](serializedparentaction-definitions-serializedreviewchildtaskaction-properties-day.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction/properties/day")
|
||||||
|
|
||||||
|
#### day Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|
||||||
## Definitions group SerializedSetCategoryExtraTimeAction
|
## Definitions group SerializedSetCategoryExtraTimeAction
|
||||||
|
|
||||||
Reference this group by using
|
Reference this group by using
|
||||||
@@ -1885,7 +1904,7 @@ Reference this group by using
|
|||||||
| [type](#type-16) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedsetcategoryextratimeaction-properties-type.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction/properties/type") |
|
| [type](#type-16) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedsetcategoryextratimeaction-properties-type.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction/properties/type") |
|
||||||
| [categoryId](#categoryid-8) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedsetcategoryextratimeaction-properties-categoryid.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction/properties/categoryId") |
|
| [categoryId](#categoryid-8) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedsetcategoryextratimeaction-properties-categoryid.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction/properties/categoryId") |
|
||||||
| [newExtraTime](#newextratime) | `number` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedsetcategoryextratimeaction-properties-newextratime.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction/properties/newExtraTime") |
|
| [newExtraTime](#newextratime) | `number` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedsetcategoryextratimeaction-properties-newextratime.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction/properties/newExtraTime") |
|
||||||
| [day](#day-1) | `number` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedsetcategoryextratimeaction-properties-day.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction/properties/day") |
|
| [day](#day-2) | `number` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedsetcategoryextratimeaction-properties-day.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction/properties/day") |
|
||||||
|
|
||||||
### type
|
### type
|
||||||
|
|
||||||
@@ -2987,6 +3006,7 @@ Reference this group by using
|
|||||||
| [type](#type-30) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-type.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/type") |
|
| [type](#type-30) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-type.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/type") |
|
||||||
| [categoryId](#categoryid-12) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-categoryid.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/categoryId") |
|
| [categoryId](#categoryid-12) | `string` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-categoryid.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/categoryId") |
|
||||||
| [blocked](#blocked) | `boolean` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-blocked.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/blocked") |
|
| [blocked](#blocked) | `boolean` | Required | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-blocked.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/blocked") |
|
||||||
|
| [blockDelay](#blockdelay) | `number` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-blockdelay.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/blockDelay") |
|
||||||
|
|
||||||
### type
|
### type
|
||||||
|
|
||||||
@@ -3050,6 +3070,24 @@ Reference this group by using
|
|||||||
|
|
||||||
`boolean`
|
`boolean`
|
||||||
|
|
||||||
|
### blockDelay
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`blockDelay`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [SerializedParentAction](serializedparentaction-definitions-serializedupdatecategoryblockallnotificationsaction-properties-blockdelay.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateCategoryBlockAllNotificationsAction/properties/blockDelay")
|
||||||
|
|
||||||
|
#### blockDelay Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|
||||||
## Definitions group SerializedUpdateCategoryBlockedTimesAction
|
## Definitions group SerializedUpdateCategoryBlockedTimesAction
|
||||||
|
|
||||||
Reference this group by using
|
Reference this group by using
|
||||||
|
|||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
# Untitled number in ServerDataStatus Schema
|
||||||
|
|
||||||
|
```txt
|
||||||
|
https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/blockNotificationDelay
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| 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") |
|
||||||
|
|
||||||
|
## blockNotificationDelay Type
|
||||||
|
|
||||||
|
`number`
|
||||||
@@ -16,26 +16,27 @@ https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData
|
|||||||
|
|
||||||
# ServerUpdatedCategoryBaseData Properties
|
# ServerUpdatedCategoryBaseData Properties
|
||||||
|
|
||||||
| Property | Type | Required | Nullable | Defined by |
|
| Property | Type | Required | Nullable | Defined by |
|
||||||
| :---------------------------------------------- | :-------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| :------------------------------------------------ | :-------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| [categoryId](#categoryid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/categoryId") |
|
| [categoryId](#categoryid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/categoryId") |
|
||||||
| [childId](#childid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-childid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/childId") |
|
| [childId](#childid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-childid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/childId") |
|
||||||
| [title](#title) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-title.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/title") |
|
| [title](#title) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-title.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/title") |
|
||||||
| [blockedTimes](#blockedtimes) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-blockedtimes.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/blockedTimes") |
|
| [blockedTimes](#blockedtimes) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-blockedtimes.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/blockedTimes") |
|
||||||
| [extraTime](#extratime) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-extratime.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/extraTime") |
|
| [extraTime](#extratime) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-extratime.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/extraTime") |
|
||||||
| [extraTimeDay](#extratimeday) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-extratimeday.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/extraTimeDay") |
|
| [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") |
|
| [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") |
|
| [tempBlockTime](#tempblocktime) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-tempblocktime.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/tempBlockTime") |
|
||||||
| [version](#version) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/version") |
|
| [version](#version) | `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") |
|
| [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") |
|
| [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") |
|
| [timeWarnings](#timewarnings) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-timewarnings.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/timeWarnings") |
|
||||||
| [mblCharging](#mblcharging) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-mblcharging.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/mblCharging") |
|
| [mblCharging](#mblcharging) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-mblcharging.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/mblCharging") |
|
||||||
| [mblMobile](#mblmobile) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-mblmobile.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/mblMobile") |
|
| [mblMobile](#mblmobile) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-mblmobile.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/mblMobile") |
|
||||||
| [sort](#sort) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-sort.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/sort") |
|
| [sort](#sort) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-sort.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/sort") |
|
||||||
| [networks](#networks) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-networks.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/networks") |
|
| [networks](#networks) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-networks.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/networks") |
|
||||||
| [dlu](#dlu) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-dlu.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/dlu") |
|
| [dlu](#dlu) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-dlu.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/dlu") |
|
||||||
| [flags](#flags) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-flags.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/flags") |
|
| [flags](#flags) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-flags.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/flags") |
|
||||||
|
| [blockNotificationDelay](#blocknotificationdelay) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-blocknotificationdelay.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/blockNotificationDelay") |
|
||||||
|
|
||||||
## categoryId
|
## categoryId
|
||||||
|
|
||||||
@@ -360,3 +361,21 @@ https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData
|
|||||||
### flags Type
|
### flags Type
|
||||||
|
|
||||||
`number`
|
`number`
|
||||||
|
|
||||||
|
## blockNotificationDelay
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`blockNotificationDelay`
|
||||||
|
|
||||||
|
* is required
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-blocknotificationdelay.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/blockNotificationDelay")
|
||||||
|
|
||||||
|
### blockNotificationDelay Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# Untitled number in ServerDataStatus Schema
|
||||||
|
|
||||||
|
```txt
|
||||||
|
https://timelimit.io/ServerDataStatus#/properties/apiLevel
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| 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") |
|
||||||
|
|
||||||
|
## apiLevel Type
|
||||||
|
|
||||||
|
`number`
|
||||||
@@ -29,6 +29,7 @@ https://timelimit.io/ServerDataStatus
|
|||||||
| [users](#users) | `object` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serveruserlist.md "https://timelimit.io/ServerDataStatus#/properties/users") |
|
| [users](#users) | `object` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serveruserlist.md "https://timelimit.io/ServerDataStatus#/properties/users") |
|
||||||
| [fullVersion](#fullversion) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-properties-fullversion.md "https://timelimit.io/ServerDataStatus#/properties/fullVersion") |
|
| [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") |
|
| [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") |
|
||||||
|
|
||||||
## devices
|
## devices
|
||||||
|
|
||||||
@@ -228,6 +229,24 @@ https://timelimit.io/ServerDataStatus
|
|||||||
|
|
||||||
`string`
|
`string`
|
||||||
|
|
||||||
|
## apiLevel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`apiLevel`
|
||||||
|
|
||||||
|
* is required
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [ServerDataStatus](serverdatastatus-properties-apilevel.md "https://timelimit.io/ServerDataStatus#/properties/apiLevel")
|
||||||
|
|
||||||
|
### apiLevel Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|
||||||
# ServerDataStatus Definitions
|
# ServerDataStatus Definitions
|
||||||
|
|
||||||
## Definitions group ServerDeviceList
|
## Definitions group ServerDeviceList
|
||||||
@@ -1256,26 +1275,27 @@ Reference this group by using
|
|||||||
{"$ref":"https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData"}
|
{"$ref":"https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData"}
|
||||||
```
|
```
|
||||||
|
|
||||||
| Property | Type | Required | Nullable | Defined by |
|
| Property | Type | Required | Nullable | Defined by |
|
||||||
| :---------------------------------------------- | :-------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| :------------------------------------------------ | :-------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| [categoryId](#categoryid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/categoryId") |
|
| [categoryId](#categoryid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/categoryId") |
|
||||||
| [childId](#childid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-childid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/childId") |
|
| [childId](#childid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-childid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/childId") |
|
||||||
| [title](#title-1) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-title.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/title") |
|
| [title](#title-1) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-title.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/title") |
|
||||||
| [blockedTimes](#blockedtimes) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-blockedtimes.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/blockedTimes") |
|
| [blockedTimes](#blockedtimes) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-blockedtimes.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/blockedTimes") |
|
||||||
| [extraTime](#extratime) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-extratime.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/extraTime") |
|
| [extraTime](#extratime) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-extratime.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/extraTime") |
|
||||||
| [extraTimeDay](#extratimeday) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-extratimeday.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/extraTimeDay") |
|
| [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") |
|
| [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") |
|
| [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-2) | `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") |
|
| [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") |
|
| [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") |
|
| [timeWarnings](#timewarnings) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-timewarnings.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/timeWarnings") |
|
||||||
| [mblCharging](#mblcharging) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-mblcharging.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/mblCharging") |
|
| [mblCharging](#mblcharging) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-mblcharging.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/mblCharging") |
|
||||||
| [mblMobile](#mblmobile) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-mblmobile.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/mblMobile") |
|
| [mblMobile](#mblmobile) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-mblmobile.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/mblMobile") |
|
||||||
| [sort](#sort) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-sort.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/sort") |
|
| [sort](#sort) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-sort.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/sort") |
|
||||||
| [networks](#networks) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-networks.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/networks") |
|
| [networks](#networks) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-networks.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/networks") |
|
||||||
| [dlu](#dlu) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-dlu.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/dlu") |
|
| [dlu](#dlu) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-dlu.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/dlu") |
|
||||||
| [flags](#flags) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-flags.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/flags") |
|
| [flags](#flags) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-flags.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/flags") |
|
||||||
|
| [blockNotificationDelay](#blocknotificationdelay) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-blocknotificationdelay.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/blockNotificationDelay") |
|
||||||
|
|
||||||
### categoryId
|
### categoryId
|
||||||
|
|
||||||
@@ -1601,6 +1621,24 @@ Reference this group by using
|
|||||||
|
|
||||||
`number`
|
`number`
|
||||||
|
|
||||||
|
### blockNotificationDelay
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`blockNotificationDelay`
|
||||||
|
|
||||||
|
* is required
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-blocknotificationdelay.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/blockNotificationDelay")
|
||||||
|
|
||||||
|
#### blockNotificationDelay Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|
||||||
## Definitions group ServerCategoryNetworkId
|
## Definitions group ServerCategoryNetworkId
|
||||||
|
|
||||||
Reference this group by using
|
Reference this group by using
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
- default value: 8080
|
- default value: 8080
|
||||||
- NODE_ENV
|
- NODE_ENV
|
||||||
- should be set to ``production`` in production
|
- should be set to ``production`` in production
|
||||||
- when using ``development``, then mails are not sent; instead they are written to a html file which is opened
|
- when using ``development``, then mails are not sent; instead they are print to the console
|
||||||
- GOOGLE_PLAY_PUBLIC_KEY
|
- GOOGLE_PLAY_PUBLIC_KEY
|
||||||
- key for validating purchases
|
- key for validating purchases
|
||||||
- purchases using google play don't work without it/ when it is not set
|
- purchases using google play don't work without it/ when it is not set
|
||||||
|
|||||||
+9
-11
@@ -4,22 +4,17 @@ You can run the timelimit server with docker. Here are two example configuration
|
|||||||
|
|
||||||
## Important
|
## Important
|
||||||
|
|
||||||
The ``image: 'timelimit-server:latest'`` will not work out of the box.
|
Watch out to actually rebuild the images and restart the containers after updates (for example using ``docker-compose up --build``).
|
||||||
You have to build this image yourself (using ``sudo docker build -t timelimit-server --no-cache --pull .``
|
|
||||||
within the root directory of this git repository) or you can replace it by
|
|
||||||
``image: docker.timelimit.io/timelimit-server`` which will use prebuilt docker
|
|
||||||
images.
|
|
||||||
|
|
||||||
In case of self building the image, don't forget to run ``docker-compose up`` again
|
|
||||||
to make docker use the new image.
|
|
||||||
|
|
||||||
## example docker-compose.yml with included database
|
## example docker-compose.yml with included database
|
||||||
|
|
||||||
```
|
```
|
||||||
|
# change the passwords and use https://docs.docker.com/compose/environment-variables/
|
||||||
|
# to keep sensitives value in a .env file while using ${VAR_NAME} here instead
|
||||||
version: '3'
|
version: '3'
|
||||||
services:
|
services:
|
||||||
api:
|
api:
|
||||||
image: 'timelimit-server:latest'
|
build: /path/to/the/timelimit/source/code
|
||||||
environment:
|
environment:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
DATABASE_URL: mariadb://timelimit:timelimitpassword@database:3306/timelimit
|
DATABASE_URL: mariadb://timelimit:timelimitpassword@database:3306/timelimit
|
||||||
@@ -62,10 +57,12 @@ before it starts working.
|
|||||||
## example docker-compose.yml with external databases
|
## example docker-compose.yml with external databases
|
||||||
|
|
||||||
```
|
```
|
||||||
version: '2'
|
# change the passwords and use https://docs.docker.com/compose/environment-variables/
|
||||||
|
# to keep sensitives value in a .env file while using ${VAR_NAME} here instead
|
||||||
|
version: '3'
|
||||||
services:
|
services:
|
||||||
api:
|
api:
|
||||||
image: 'timelimit-server:latest'
|
build: /path/to/the/timelimit/source/code
|
||||||
environment:
|
environment:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
DATABASE_URL: postgres://user:pass@example.com:5432/dbname
|
DATABASE_URL: postgres://user:pass@example.com:5432/dbname
|
||||||
@@ -87,4 +84,5 @@ services:
|
|||||||
# - "9000:8080"
|
# - "9000:8080"
|
||||||
# in case the database runs outside of docker and you don't want to use the host network mode, see
|
# in case the database runs outside of docker and you don't want to use the host network mode, see
|
||||||
# https://forums.docker.com/t/accessing-host-machine-from-within-docker-container/14248
|
# https://forums.docker.com/t/accessing-host-machine-from-within-docker-container/14248
|
||||||
|
# or don't use docker ...
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ There are 3 options for running this application:
|
|||||||
|
|
||||||
Option 1: Build a docker image and use it
|
Option 1: Build a docker image and use it
|
||||||
Option 2: Install Node.JS (see [npm-commands](./npm-commands.md))
|
Option 2: Install Node.JS (see [npm-commands](./npm-commands.md))
|
||||||
Option 3: Use a prebuilt docker image
|
Option 3: Use ``timelimit-server-setup.sh`` if there is nothing yet at your system
|
||||||
|
|
||||||
After starting it, you can open ``http://server/time`` to test it,
|
After starting it, you can open ``http://server/time`` to test it,
|
||||||
it should show a timestamp
|
it should show a timestamp
|
||||||
|
|||||||
@@ -0,0 +1,190 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>
|
||||||
|
</title>
|
||||||
|
<!--[if !mso]><!-->
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<!--<![endif]-->
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<style type="text/css">
|
||||||
|
#outlook a {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
-ms-text-size-adjust: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table,
|
||||||
|
td {
|
||||||
|
border-collapse: collapse;
|
||||||
|
mso-table-lspace: 0pt;
|
||||||
|
mso-table-rspace: 0pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: 0;
|
||||||
|
height: auto;
|
||||||
|
line-height: 100%;
|
||||||
|
outline: none;
|
||||||
|
text-decoration: none;
|
||||||
|
-ms-interpolation-mode: bicubic;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
display: block;
|
||||||
|
margin: 13px 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<!--[if mso]>
|
||||||
|
<noscript>
|
||||||
|
<xml>
|
||||||
|
<o:OfficeDocumentSettings>
|
||||||
|
<o:AllowPNG/>
|
||||||
|
<o:PixelsPerInch>96</o:PixelsPerInch>
|
||||||
|
</o:OfficeDocumentSettings>
|
||||||
|
</xml>
|
||||||
|
</noscript>
|
||||||
|
<![endif]-->
|
||||||
|
<!--[if lte mso 11]>
|
||||||
|
<style type="text/css">
|
||||||
|
.mj-outlook-group-fix { width:100% !important; }
|
||||||
|
</style>
|
||||||
|
<![endif]-->
|
||||||
|
<style type="text/css">
|
||||||
|
@media only screen and (min-width:480px) {
|
||||||
|
.mj-column-per-100 {
|
||||||
|
width: 100% !important;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style media="screen and (min-width:480px)">
|
||||||
|
.moz-text-html .mj-column-per-100 {
|
||||||
|
width: 100% !important;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style type="text/css">
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="word-spacing:normal;">
|
||||||
|
<div style="">
|
||||||
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" bgcolor="#009688" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
|
<div style="background:#009688;background-color:#009688;margin:0px auto;max-width:600px;">
|
||||||
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#009688;background-color:#009688;width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;line-height:1;text-align:left;color:#ffffff;">TimeLimit</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
|
<p><%= preText %> <b><%= deviceName %></b> <%= postText %></p>
|
||||||
|
<p><%= securityText %></p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<p style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:100%;">
|
||||||
|
</p>
|
||||||
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:550px;" role="presentation" width="550px" ><tr><td style="height:0;line-height:0;">
|
||||||
|
</td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
|
<p> Sie erhalten diese Nachricht, da ein Gerät zu Ihrem Konto hinzugefügt wurde. Mit diesem Gerät können die TimeLimit-Einstellungen ohne ein Passwort geändert werden. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten. </p>
|
||||||
|
<p> You got this message because a device was added to your account. This device can be used to change the TimeLimit configuration without any password. If you have got any questions, then you can reply to this message. </p>
|
||||||
|
<p> © <%= mailimprint %> </p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
<mjml>
|
||||||
|
<mj-body>
|
||||||
|
<mj-section background-color="#009688">
|
||||||
|
<mj-column>
|
||||||
|
<mj-text font-size="20px" color="#ffffff">TimeLimit</mj-text>
|
||||||
|
</mj-column>
|
||||||
|
</mj-section>
|
||||||
|
<mj-section>
|
||||||
|
<mj-column>
|
||||||
|
<mj-text>
|
||||||
|
<p><%= preText %> <b><%= deviceName %></b> <%= postText %></p>
|
||||||
|
<p><%= securityText %></p>
|
||||||
|
</mj-text>
|
||||||
|
</mj-column>
|
||||||
|
</mj-section>
|
||||||
|
<mj-section>
|
||||||
|
<mj-column>
|
||||||
|
<mj-divider border-width="1px" border-style="dashed" border-color="lightgrey" />
|
||||||
|
</mj-column>
|
||||||
|
</mj-section>
|
||||||
|
<mj-section>
|
||||||
|
<mj-column>
|
||||||
|
<mj-text>
|
||||||
|
<p>
|
||||||
|
Sie erhalten diese Nachricht, da ein Gerät zu Ihrem Konto hinzugefügt wurde.
|
||||||
|
Mit diesem Gerät können die TimeLimit-Einstellungen ohne ein Passwort geändert werden.
|
||||||
|
Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
You got this message because a device was added to your account.
|
||||||
|
This device can be used to change the TimeLimit configuration without any password.
|
||||||
|
If you have got any questions, then you can reply to this message.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
© <%= mailimprint %>
|
||||||
|
</p>
|
||||||
|
</mj-text>
|
||||||
|
</mj-column>
|
||||||
|
</mj-section>
|
||||||
|
</mj-body>
|
||||||
|
</mjml>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<%- subject %>
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<%- preText %> <%- deviceName %> <%- postText %>
|
||||||
|
|
||||||
|
<%- securityText %>
|
||||||
|
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Sie erhalten diese Nachricht, da ein Gerät zu Ihrem Konto hinzugefügt wurde.
|
||||||
|
Mit diesem Gerät können die TimeLimit-Einstellungen ohne ein Passwort geändert werden.
|
||||||
|
Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
||||||
|
|
||||||
|
You got this message because a device was added to your account.
|
||||||
|
This device can be used to change the TimeLimit configuration without any password.
|
||||||
|
If you have got any questions, then you can reply to this message.
|
||||||
|
|
||||||
|
<C> <%- mailimprint %>
|
||||||
+77
-196
@@ -2,8 +2,9 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title> </title>
|
<title>
|
||||||
<!--[if !mso]><!-- -->
|
</title>
|
||||||
|
<!--[if !mso]><!-->
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<!--<![endif]-->
|
<!--<![endif]-->
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
@@ -13,18 +14,6 @@
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ReadMsgBody {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ExternalClass {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ExternalClass * {
|
|
||||||
line-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@@ -53,29 +42,19 @@
|
|||||||
margin: 13px 0;
|
margin: 13px 0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<!--[if !mso]><!-->
|
|
||||||
<style type="text/css">
|
|
||||||
@media only screen and (max-width:480px) {
|
|
||||||
@-ms-viewport {
|
|
||||||
width: 320px;
|
|
||||||
}
|
|
||||||
@viewport {
|
|
||||||
width: 320px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<!--<![endif]-->
|
|
||||||
<!--[if mso]>
|
<!--[if mso]>
|
||||||
|
<noscript>
|
||||||
<xml>
|
<xml>
|
||||||
<o:OfficeDocumentSettings>
|
<o:OfficeDocumentSettings>
|
||||||
<o:AllowPNG/>
|
<o:AllowPNG/>
|
||||||
<o:PixelsPerInch>96</o:PixelsPerInch>
|
<o:PixelsPerInch>96</o:PixelsPerInch>
|
||||||
</o:OfficeDocumentSettings>
|
</o:OfficeDocumentSettings>
|
||||||
</xml>
|
</xml>
|
||||||
|
</noscript>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
<!--[if lte mso 11]>
|
<!--[if lte mso 11]>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.outlook-group-fix { width:100% !important; }
|
.mj-outlook-group-fix { width:100% !important; }
|
||||||
</style>
|
</style>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@@ -86,224 +65,126 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
<style media="screen and (min-width:480px)">
|
||||||
|
.moz-text-html .mj-column-per-100 {
|
||||||
|
width: 100% !important;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body style="word-spacing:normal;">
|
||||||
<div style="">
|
<div style="">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" bgcolor="#009688" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
<table
|
<div style="background:#009688;background-color:#009688;margin:0px auto;max-width:600px;">
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="background:#009688;background-color:#009688;Margin:0px auto;max-width:600px;">
|
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#009688;background-color:#009688;width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#009688;background-color:#009688;width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;vertical-align:top;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 outlook-group-fix" style="font-size:13px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;line-height:1;text-align:left;color:#ffffff;"> TimeLimit </div>
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
</td>
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;line-height:1;text-align:left;color:#ffffff;">TimeLimit</div>
|
||||||
</tr>
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="Margin:0px auto;max-width:600px;">
|
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;vertical-align:top;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 outlook-group-fix" style="font-size:13px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
<p>
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
<%= introtext %>
|
<p> <%= introtext %> </p>
|
||||||
</p>
|
<p><b><%= code %></b></p>
|
||||||
<p><b><%= code %></b></p>
|
<p><%= outrotext %></p> <% if (deviceName !== null) { -%> <p><%= deviceNameIntro %> <b><%= deviceName %></b> <%= deviceNameOutro %></p> <% } -%>
|
||||||
<p>
|
</div>
|
||||||
<%= outrotext %>
|
</td>
|
||||||
</p>
|
</tr>
|
||||||
</div>
|
</tbody>
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="Margin:0px auto;max-width:600px;">
|
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;vertical-align:top;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 outlook-group-fix" style="font-size:13px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<p style="border-top:dashed 1px lightgrey;font-size:1;margin:0px auto;width:100%;"> </p>
|
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
<!--[if mso | IE]>
|
<p style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:100%;">
|
||||||
<table
|
</p>
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:dashed 1px lightgrey;font-size:1;margin:0px auto;width:550px;" role="presentation" width="550px"
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:550px;" role="presentation" width="550px" ><tr><td style="height:0;line-height:0;">
|
||||||
>
|
</td></tr></table><![endif]-->
|
||||||
<tr>
|
</td>
|
||||||
<td style="height:0;line-height:0;">
|
</tr>
|
||||||
|
</tbody>
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="Margin:0px auto;max-width:600px;">
|
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;vertical-align:top;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 outlook-group-fix" style="font-size:13px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
<p> You got this mail because your mail address was entered at the TimeLimit App for signing in. If you did not request this mail, then you can ignore it. If you have got any questions, then you can reply to this messagge. </p>
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
<p>
|
<p> Sie erhalten diese Nachricht, da Ihre E-Mail-Adresse in der TimeLimit-App zum Anmelden eingegeben wurde. Wenn Sie diese E-Mail nicht angefordert haben, können Sie diese ignorieren. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten. </p>
|
||||||
Sie erhalten diese Nachricht, da Ihre E-Mail-Adresse in der TimeLimit-App zum Anmelden eingegeben wurde. Wenn Sie diese E-Mail nicht angefordert haben, können Sie diese ignorieren. Falls Sie Fragen haben können Sie einfach auf
|
<p> You got this mail because your mail address was entered at the TimeLimit App for signing in. If you did not request this mail, then you can ignore it. If you have got any questions, then you can reply to this message. </p>
|
||||||
diese E-Mail antworten. </p>
|
<p> © <%= mailimprint %> </p>
|
||||||
<p> ©
|
</div>
|
||||||
<%= mailimprint %>
|
</td>
|
||||||
</p>
|
</tr>
|
||||||
</div>
|
</tbody>
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,9 @@
|
|||||||
</p>
|
</p>
|
||||||
<p><b><%= code %></b></p>
|
<p><b><%= code %></b></p>
|
||||||
<p><%= outrotext %></p>
|
<p><%= outrotext %></p>
|
||||||
|
<% if (deviceName !== null) { -%>
|
||||||
|
<p><%= deviceNameIntro %> <b><%= deviceName %></b> <%= deviceNameOutro %></p>
|
||||||
|
<% } -%>
|
||||||
</mj-text>
|
</mj-text>
|
||||||
</mj-column>
|
</mj-column>
|
||||||
</mj-section>
|
</mj-section>
|
||||||
@@ -25,10 +28,10 @@
|
|||||||
<mj-column>
|
<mj-column>
|
||||||
<mj-text>
|
<mj-text>
|
||||||
<p>
|
<p>
|
||||||
You got this mail because your mail address was entered at the TimeLimit App for signing in. If you did not request this mail, then you can ignore it. If you have got any questions, then you can reply to this messagge.
|
Sie erhalten diese Nachricht, da Ihre E-Mail-Adresse in der TimeLimit-App zum Anmelden eingegeben wurde. Wenn Sie diese E-Mail nicht angefordert haben, können Sie diese ignorieren. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Sie erhalten diese Nachricht, da Ihre E-Mail-Adresse in der TimeLimit-App zum Anmelden eingegeben wurde. Wenn Sie diese E-Mail nicht angefordert haben, können Sie diese ignorieren. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
You got this mail because your mail address was entered at the TimeLimit App for signing in. If you did not request this mail, then you can ignore it. If you have got any questions, then you can reply to this message.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
© <%= mailimprint %>
|
© <%= mailimprint %>
|
||||||
|
|||||||
@@ -4,14 +4,18 @@
|
|||||||
|
|
||||||
<%- outrotext %>
|
<%- outrotext %>
|
||||||
|
|
||||||
----------------------
|
<% if (deviceName !== null) { -%>
|
||||||
|
<%- deviceNameIntro %> <%- deviceName %> <%- deviceNameOutro %>
|
||||||
|
|
||||||
You got this mail because your mail address was entered at the TimeLimit App for signing in.
|
<% } -%>
|
||||||
If you did not request this mail, then you can ignore it.
|
----------------------
|
||||||
If you have got any questions, then you can reply to this messagge.
|
|
||||||
|
|
||||||
Sie erhalten diese Nachricht, da Ihre E-Mail-Adresse in der TimeLimit-App zum Anmelden eingegeben wurde.
|
Sie erhalten diese Nachricht, da Ihre E-Mail-Adresse in der TimeLimit-App zum Anmelden eingegeben wurde.
|
||||||
Wenn Sie diese E-Mail nicht angefordert haben, können Sie diese ignorieren.
|
Wenn Sie diese E-Mail nicht angefordert haben, können Sie diese ignorieren.
|
||||||
Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
||||||
|
|
||||||
|
You got this mail because your mail address was entered at the TimeLimit App for signing in.
|
||||||
|
If you did not request this mail, then you can ignore it.
|
||||||
|
If you have got any questions, then you can reply to this message.
|
||||||
|
|
||||||
<C> <%- mailimprint %>
|
<C> <%- mailimprint %>
|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title> </title>
|
<title>
|
||||||
<!--[if !mso]><!-- -->
|
</title>
|
||||||
|
<!--[if !mso]><!-->
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<!--<![endif]-->
|
<!--<![endif]-->
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
@@ -13,18 +14,6 @@
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ReadMsgBody {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ExternalClass {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ExternalClass * {
|
|
||||||
line-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@@ -53,29 +42,19 @@
|
|||||||
margin: 13px 0;
|
margin: 13px 0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<!--[if !mso]><!-->
|
|
||||||
<style type="text/css">
|
|
||||||
@media only screen and (max-width:480px) {
|
|
||||||
@-ms-viewport {
|
|
||||||
width: 320px;
|
|
||||||
}
|
|
||||||
@viewport {
|
|
||||||
width: 320px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<!--<![endif]-->
|
|
||||||
<!--[if mso]>
|
<!--[if mso]>
|
||||||
|
<noscript>
|
||||||
<xml>
|
<xml>
|
||||||
<o:OfficeDocumentSettings>
|
<o:OfficeDocumentSettings>
|
||||||
<o:AllowPNG/>
|
<o:AllowPNG/>
|
||||||
<o:PixelsPerInch>96</o:PixelsPerInch>
|
<o:PixelsPerInch>96</o:PixelsPerInch>
|
||||||
</o:OfficeDocumentSettings>
|
</o:OfficeDocumentSettings>
|
||||||
</xml>
|
</xml>
|
||||||
|
</noscript>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
<!--[if lte mso 11]>
|
<!--[if lte mso 11]>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.outlook-group-fix { width:100% !important; }
|
.mj-outlook-group-fix { width:100% !important; }
|
||||||
</style>
|
</style>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@@ -86,222 +65,125 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
<style media="screen and (min-width:480px)">
|
||||||
|
.moz-text-html .mj-column-per-100 {
|
||||||
|
width: 100% !important;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body style="word-spacing:normal;">
|
||||||
<div style="">
|
<div style="">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" bgcolor="#009688" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
<table
|
<div style="background:#009688;background-color:#009688;margin:0px auto;max-width:600px;">
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="background:#009688;background-color:#009688;Margin:0px auto;max-width:600px;">
|
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#009688;background-color:#009688;width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#009688;background-color:#009688;width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;vertical-align:top;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 outlook-group-fix" style="font-size:13px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;line-height:1;text-align:left;color:#ffffff;"> TimeLimit </div>
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
</td>
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;line-height:1;text-align:left;color:#ffffff;">TimeLimit</div>
|
||||||
</tr>
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="Margin:0px auto;max-width:600px;">
|
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;vertical-align:top;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 outlook-group-fix" style="font-size:13px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
<p> Die TimeLimit-Installation von dem Gerät
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
<%= deviceName %> hat eine Manipulation gemeldet. Sie können die Details dazu in der TimeLimit-App einsehen. <br /> Solange Sie nicht die Warnung in TimeLimit bestätigen (ignorieren und/ oder beheben) erhalten Sie keine weitere Manipulationsbenachrichtigungen
|
<p> Die TimeLimit-Installation von dem Gerät <b><%= deviceName %></b> hat eine Manipulation gemeldet. Sie können die Details dazu in der TimeLimit-App einsehen. <br /> Solange Sie nicht die Warnung in TimeLimit bestätigen (ignorieren und/ oder beheben) erhalten Sie keine weitere Manipulationsbenachrichtigungen für dieses Gerät. </p>
|
||||||
für dieses Gerät. </p>
|
<p> TimeLimit at <b><%= deviceName %></b> reported a manipulation. You can see the details in the TimeLimit App. <br /> You will not get any further warnings for this device until you confirm (ignore and/ or fix) the manipulation in the TimeLimit App. </p>
|
||||||
<p> TimeLimit at
|
</div>
|
||||||
<%= deviceName %> reported a manipulation. You can see the details in the TimeLimit App. <br /> You will not get any further warnings for this device until you confirm (ignore and/ or fix) the manipulation in the TimeLimit App. </p>
|
</td>
|
||||||
</div>
|
</tr>
|
||||||
</td>
|
</tbody>
|
||||||
</tr>
|
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="Margin:0px auto;max-width:600px;">
|
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;vertical-align:top;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 outlook-group-fix" style="font-size:13px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<p style="border-top:dashed 1px lightgrey;font-size:1;margin:0px auto;width:100%;"> </p>
|
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
<!--[if mso | IE]>
|
<p style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:100%;">
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:dashed 1px lightgrey;font-size:1;margin:0px auto;width:550px;" role="presentation" width="550px"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="height:0;line-height:0;">
|
|
||||||
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!--[if mso | IE]>
|
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!--[if mso | IE]>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="Margin:0px auto;max-width:600px;">
|
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;vertical-align:top;">
|
|
||||||
<!--[if mso | IE]>
|
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 outlook-group-fix" style="font-size:13px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
|
||||||
<tr>
|
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
|
||||||
<p> Sie erhalten diese Nachricht, weil Sie E-Mail-Benachrichtigungen in TimeLimit aktiviert haben. Sie können die Nachrichten in der TimeLimit-App abbestellen, oder indem Sie auf diese Nachricht antworten, dass Sie diese Benachrichtigungen
|
|
||||||
nicht mehr erhalten möchten. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten. </p>
|
|
||||||
<p> You got this mail because you enable mail notifications for this in TimeLimit. You can disable getting these messages in the TimeLimit App or by replying to this message that you don't want to get these notifications anymore. If
|
|
||||||
you have got any questions, then you can reply to this messagge. </p>
|
|
||||||
<p> ©
|
|
||||||
<%= mailimprint %>
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:550px;" role="presentation" width="550px" ><tr><td style="height:0;line-height:0;">
|
||||||
</td>
|
</td></tr></table><![endif]-->
|
||||||
</tr>
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
</tr>
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
|
<p> Sie erhalten diese Nachricht, weil Sie E-Mail-Benachrichtigungen in TimeLimit aktiviert haben. Sie können die Nachrichten in der TimeLimit-App abbestellen, oder indem Sie auf diese Nachricht antworten, dass Sie diese Benachrichtigungen nicht mehr erhalten möchten. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten. </p>
|
||||||
|
<p> You got this mail because you enable mail notifications for this in TimeLimit. You can disable getting these messages in the TimeLimit App or by replying to this message that you don't want to get these notifications anymore. If you have got any questions, then you can reply to this message. </p>
|
||||||
|
<p> © <%= mailimprint %> </p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<![endif]-->
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<mj-column>
|
<mj-column>
|
||||||
<mj-text>
|
<mj-text>
|
||||||
<p>
|
<p>
|
||||||
Die TimeLimit-Installation von dem Gerät <%= deviceName %> hat eine Manipulation gemeldet.
|
Die TimeLimit-Installation von dem Gerät <b><%= deviceName %></b> hat eine Manipulation gemeldet.
|
||||||
Sie können die Details dazu in der TimeLimit-App einsehen.
|
Sie können die Details dazu in der TimeLimit-App einsehen.
|
||||||
<br />
|
<br />
|
||||||
Solange Sie nicht die Warnung in TimeLimit bestätigen (ignorieren und/ oder beheben)
|
Solange Sie nicht die Warnung in TimeLimit bestätigen (ignorieren und/ oder beheben)
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
TimeLimit at <%= deviceName %> reported a manipulation.
|
TimeLimit at <b><%= deviceName %></b> reported a manipulation.
|
||||||
You can see the details in the TimeLimit App.
|
You can see the details in the TimeLimit App.
|
||||||
<br />
|
<br />
|
||||||
You will not get any further warnings for this device
|
You will not get any further warnings for this device
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
You got this mail because you enable mail notifications for this in TimeLimit.
|
You got this mail because you enable mail notifications for this in TimeLimit.
|
||||||
You can disable getting these messages in the TimeLimit App or by
|
You can disable getting these messages in the TimeLimit App or by
|
||||||
replying to this message that you don't want to get these notifications anymore.
|
replying to this message that you don't want to get these notifications anymore.
|
||||||
If you have got any questions, then you can reply to this messagge.
|
If you have got any questions, then you can reply to this message.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
© <%= mailimprint %>
|
© <%= mailimprint %>
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
Die TimeLimit-Installation von dem Gerät <%= deviceName %> hat eine Manipulation gemeldet.
|
Die TimeLimit-Installation von dem Gerät <%- deviceName %> hat eine Manipulation gemeldet.
|
||||||
Sie können die Details dazu in der TimeLimit-App einsehen.
|
Sie können die Details dazu in der TimeLimit-App einsehen.
|
||||||
|
|
||||||
Solange Sie nicht die Warnung in TimeLimit bestätigen (ignorieren und/ oder beheben)
|
Solange Sie nicht die Warnung in TimeLimit bestätigen (ignorieren und/ oder beheben)
|
||||||
erhalten Sie keine weitere Manipulationsbenachrichtigungen für dieses Gerät.
|
erhalten Sie keine weitere Manipulationsbenachrichtigungen für dieses Gerät.
|
||||||
|
|
||||||
|
|
||||||
TimeLimit at <%= deviceName %> reported a manipulation.
|
TimeLimit at <%- deviceName %> reported a manipulation.
|
||||||
You can see the details in the TimeLimit App.
|
You can see the details in the TimeLimit App.
|
||||||
|
|
||||||
You will not get any further warnings for this device
|
You will not get any further warnings for this device
|
||||||
@@ -21,6 +21,6 @@ Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
|||||||
You got this mail because you enable mail notifications for this in TimeLimit.
|
You got this mail because you enable mail notifications for this in TimeLimit.
|
||||||
You can disable getting these messages in the TimeLimit App or by
|
You can disable getting these messages in the TimeLimit App or by
|
||||||
replying to this message that you don't want to get these notifications anymore.
|
replying to this message that you don't want to get these notifications anymore.
|
||||||
If you have got any questions, then you can reply to this messagge.
|
If you have got any questions, then you can reply to this message.
|
||||||
|
|
||||||
<C> <%- mailimprint %>
|
<C> <%- mailimprint %>
|
||||||
|
|||||||
@@ -0,0 +1,190 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>
|
||||||
|
</title>
|
||||||
|
<!--[if !mso]><!-->
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<!--<![endif]-->
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<style type="text/css">
|
||||||
|
#outlook a {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
-ms-text-size-adjust: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table,
|
||||||
|
td {
|
||||||
|
border-collapse: collapse;
|
||||||
|
mso-table-lspace: 0pt;
|
||||||
|
mso-table-rspace: 0pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: 0;
|
||||||
|
height: auto;
|
||||||
|
line-height: 100%;
|
||||||
|
outline: none;
|
||||||
|
text-decoration: none;
|
||||||
|
-ms-interpolation-mode: bicubic;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
display: block;
|
||||||
|
margin: 13px 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<!--[if mso]>
|
||||||
|
<noscript>
|
||||||
|
<xml>
|
||||||
|
<o:OfficeDocumentSettings>
|
||||||
|
<o:AllowPNG/>
|
||||||
|
<o:PixelsPerInch>96</o:PixelsPerInch>
|
||||||
|
</o:OfficeDocumentSettings>
|
||||||
|
</xml>
|
||||||
|
</noscript>
|
||||||
|
<![endif]-->
|
||||||
|
<!--[if lte mso 11]>
|
||||||
|
<style type="text/css">
|
||||||
|
.mj-outlook-group-fix { width:100% !important; }
|
||||||
|
</style>
|
||||||
|
<![endif]-->
|
||||||
|
<style type="text/css">
|
||||||
|
@media only screen and (min-width:480px) {
|
||||||
|
.mj-column-per-100 {
|
||||||
|
width: 100% !important;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style media="screen and (min-width:480px)">
|
||||||
|
.moz-text-html .mj-column-per-100 {
|
||||||
|
width: 100% !important;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style type="text/css">
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body style="word-spacing:normal;">
|
||||||
|
<div style="">
|
||||||
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" bgcolor="#009688" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
|
<div style="background:#009688;background-color:#009688;margin:0px auto;max-width:600px;">
|
||||||
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#009688;background-color:#009688;width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;line-height:1;text-align:left;color:#ffffff;">TimeLimit</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
|
<p><%= text %></p>
|
||||||
|
<p><%= securityText %></p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<p style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:100%;">
|
||||||
|
</p>
|
||||||
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:550px;" role="presentation" width="550px" ><tr><td style="height:0;line-height:0;">
|
||||||
|
</td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
|
<p> Sie erhalten diese Nachricht, da Ihr TimeLimit-Passwort geändert wurde. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten. </p>
|
||||||
|
<p> You got this message because the password reset feature was used for your account. If you have got any questions, then you can reply to this message. </p>
|
||||||
|
<p> © <%= mailimprint %> </p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<mjml>
|
||||||
|
<mj-body>
|
||||||
|
<mj-section background-color="#009688">
|
||||||
|
<mj-column>
|
||||||
|
<mj-text font-size="20px" color="#ffffff">TimeLimit</mj-text>
|
||||||
|
</mj-column>
|
||||||
|
</mj-section>
|
||||||
|
<mj-section>
|
||||||
|
<mj-column>
|
||||||
|
<mj-text>
|
||||||
|
<p><%= text %></p>
|
||||||
|
<p><%= securityText %></p>
|
||||||
|
</mj-text>
|
||||||
|
</mj-column>
|
||||||
|
</mj-section>
|
||||||
|
<mj-section>
|
||||||
|
<mj-column>
|
||||||
|
<mj-divider border-width="1px" border-style="dashed" border-color="lightgrey" />
|
||||||
|
</mj-column>
|
||||||
|
</mj-section>
|
||||||
|
<mj-section>
|
||||||
|
<mj-column>
|
||||||
|
<mj-text>
|
||||||
|
<p>
|
||||||
|
Sie erhalten diese Nachricht, da Ihr TimeLimit-Passwort geändert wurde.
|
||||||
|
Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
You got this message because the password reset feature was used for your account.
|
||||||
|
If you have got any questions, then you can reply to this message.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
© <%= mailimprint %>
|
||||||
|
</p>
|
||||||
|
</mj-text>
|
||||||
|
</mj-column>
|
||||||
|
</mj-section>
|
||||||
|
</mj-body>
|
||||||
|
</mjml>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<%- subject %>
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<%- text %>
|
||||||
|
|
||||||
|
<%- securityText %>
|
||||||
|
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Sie erhalten diese Nachricht, da Ihr TimeLimit-Passwort geändert wurde.
|
||||||
|
Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
||||||
|
|
||||||
|
You got this message because the password reset feature was used for your account.
|
||||||
|
If you have got any questions, then you can reply to this message.
|
||||||
|
|
||||||
|
<C> <%- mailimprint %>
|
||||||
+81
-172
@@ -2,8 +2,9 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title> </title>
|
<title>
|
||||||
<!--[if !mso]><!-- -->
|
</title>
|
||||||
|
<!--[if !mso]><!-->
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<!--<![endif]-->
|
<!--<![endif]-->
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
@@ -42,20 +43,20 @@
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<!--[if mso]>
|
<!--[if mso]>
|
||||||
|
<noscript>
|
||||||
<xml>
|
<xml>
|
||||||
<o:OfficeDocumentSettings>
|
<o:OfficeDocumentSettings>
|
||||||
<o:AllowPNG/>
|
<o:AllowPNG/>
|
||||||
<o:PixelsPerInch>96</o:PixelsPerInch>
|
<o:PixelsPerInch>96</o:PixelsPerInch>
|
||||||
</o:OfficeDocumentSettings>
|
</o:OfficeDocumentSettings>
|
||||||
</xml>
|
</xml>
|
||||||
|
</noscript>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
<!--[if lte mso 11]>
|
<!--[if lte mso 11]>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.mj-outlook-group-fix { width:100% !important; }
|
.mj-outlook-group-fix { width:100% !important; }
|
||||||
</style>
|
</style>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
<!--[if !mso]><!-->
|
|
||||||
<!--<![endif]-->
|
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@media only screen and (min-width:480px) {
|
@media only screen and (min-width:480px) {
|
||||||
.mj-column-per-100 {
|
.mj-column-per-100 {
|
||||||
@@ -64,223 +65,131 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
<style media="screen and (min-width:480px)">
|
||||||
|
.moz-text-html .mj-column-per-100 {
|
||||||
|
width: 100% !important;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body style="word-spacing:normal;">
|
||||||
<div style="">
|
<div style="">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" bgcolor="#009688" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="background:#009688;background-color:#009688;margin:0px auto;max-width:600px;">
|
<div style="background:#009688;background-color:#009688;margin:0px auto;max-width:600px;">
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#009688;background-color:#009688;width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#009688;background-color:#009688;width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;line-height:1;text-align:left;color:#ffffff;">TimeLimit</div>
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
</td>
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;line-height:1;text-align:left;color:#ffffff;">TimeLimit</div>
|
||||||
</tr>
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="margin:0px auto;max-width:600px;">
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
<p>
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
<%= child %> hat angegeben, dass die Aufgabe
|
<p>
|
||||||
<%= task %> erledigt wurde. Die angeblich erledigten Aufgaben werden auf der Startseite der TimeLimit-App angezeigt. Dort kann die Erledigung bestätigt werden. </p>
|
<b><%= child %></b> hat angegeben, dass die Aufgabe <b><%= task %></b> erledigt wurde. Die angeblich erledigten Aufgaben werden auf der Startseite der TimeLimit-App angezeigt. Dort kann die Erledigung bestätigt werden.
|
||||||
<p> Da die Anzahl der Benachrichtigungs-E-Mails begrenzt ist erhalten Sie möglicherweise nicht bei jeder Aufgabenerledigung eine derartige E-Mail. </p>
|
</p>
|
||||||
<p>
|
<p> Da die Anzahl der Benachrichtigungs-E-Mails begrenzt ist erhalten Sie möglicherweise nicht bei jeder Aufgabenerledigung eine derartige E-Mail. </p>
|
||||||
<%= child %> reported that
|
<p>
|
||||||
<%= task %> was finished. You can see the tasks which are marked as finished at the overview screen of the TimeLimit application. You can confirm the task completion there. </p>
|
<b><%= child %></b> reported that <b><%= task %></b> was finished. You can see the tasks which are marked as finished at the overview screen of the TimeLimit application. You can confirm the task completion there.
|
||||||
<p> There are limits for the notifications mails so that it can happen that you do not get a mail for each completed task. </p>
|
</p>
|
||||||
</div>
|
<p> There are limits for the notifications mails so that it can happen that you do not get a mail for each completed task. </p>
|
||||||
</td>
|
</div>
|
||||||
</tr>
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="margin:0px auto;max-width:600px;">
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<p style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:100%;"> </p>
|
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
<!--[if mso | IE]>
|
<p style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:100%;">
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:550px;" role="presentation" width="550px"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="height:0;line-height:0;">
|
|
||||||
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!--[if mso | IE]>
|
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!--[if mso | IE]>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="margin:0px auto;max-width:600px;">
|
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
|
||||||
<!--[if mso | IE]>
|
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
|
||||||
<tr>
|
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
|
||||||
<p> Sie erhalten diese Nachricht, weil Sie E-Mail-Benachrichtigungen in TimeLimit aktiviert haben. Sie können die Nachrichten in der TimeLimit-App abbestellen. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten. </p>
|
|
||||||
<p> You got this mail because you enable mail notifications for this in TimeLimit. You can disable getting these messages in the TimeLimit App. If you have got any questions, then you can reply to this messagge. </p>
|
|
||||||
<p> ©
|
|
||||||
<%= mailimprint %>
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:550px;" role="presentation" width="550px" ><tr><td style="height:0;line-height:0;">
|
||||||
</td>
|
</td></tr></table><![endif]-->
|
||||||
</tr>
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
</tr>
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
|
<p> Sie erhalten diese Nachricht, weil Sie E-Mail-Benachrichtigungen in TimeLimit aktiviert haben. Sie können die Nachrichten in der TimeLimit-App abbestellen. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten. </p>
|
||||||
|
<p> You got this mail because you enable mail notifications for this in TimeLimit. You can disable getting these messages in the TimeLimit App. If you have got any questions, then you can reply to this message. </p>
|
||||||
|
<p> © <%= mailimprint %> </p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<![endif]-->
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<mj-column>
|
<mj-column>
|
||||||
<mj-text>
|
<mj-text>
|
||||||
<p>
|
<p>
|
||||||
<%= child %> hat angegeben, dass die Aufgabe <%= task %> erledigt wurde.
|
<b><%= child %></b> hat angegeben, dass die Aufgabe <b><%= task %></b> erledigt wurde.
|
||||||
Die angeblich erledigten Aufgaben werden auf der Startseite der TimeLimit-App
|
Die angeblich erledigten Aufgaben werden auf der Startseite der TimeLimit-App
|
||||||
angezeigt. Dort kann die Erledigung bestätigt werden.
|
angezeigt. Dort kann die Erledigung bestätigt werden.
|
||||||
</p>
|
</p>
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
möglicherweise nicht bei jeder Aufgabenerledigung eine derartige E-Mail.
|
möglicherweise nicht bei jeder Aufgabenerledigung eine derartige E-Mail.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<%= child %> reported that <%= task %> was finished.
|
<b><%= child %></b> reported that <b><%= task %></b> was finished.
|
||||||
You can see the tasks which are marked as finished at the overview screen
|
You can see the tasks which are marked as finished at the overview screen
|
||||||
of the TimeLimit application. You can confirm the task completion there.
|
of the TimeLimit application. You can confirm the task completion there.
|
||||||
</p>
|
</p>
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
<p>
|
<p>
|
||||||
You got this mail because you enable mail notifications for this in TimeLimit.
|
You got this mail because you enable mail notifications for this in TimeLimit.
|
||||||
You can disable getting these messages in the TimeLimit App.
|
You can disable getting these messages in the TimeLimit App.
|
||||||
If you have got any questions, then you can reply to this messagge.
|
If you have got any questions, then you can reply to this message.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
© <%= mailimprint %>
|
© <%= mailimprint %>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ angezeigt. Dort kann die Erledigung bestätigt werden.
|
|||||||
Da die Anzahl der Benachrichtigungs-E-Mails begrenzt ist erhalten Sie
|
Da die Anzahl der Benachrichtigungs-E-Mails begrenzt ist erhalten Sie
|
||||||
möglicherweise nicht bei jeder Aufgabenerledigung eine derartige E-Mail.
|
möglicherweise nicht bei jeder Aufgabenerledigung eine derartige E-Mail.
|
||||||
|
|
||||||
<%= child %> reported that <%= task %> was finished.
|
<%- child %> reported that <%- task %> was finished.
|
||||||
You can see the tasks which are marked as finished at the overview screen
|
You can see the tasks which are marked as finished at the overview screen
|
||||||
of the TimeLimit application. You can confirm the task completion there.
|
of the TimeLimit application. You can confirm the task completion there.
|
||||||
|
|
||||||
@@ -20,6 +20,6 @@ Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
|||||||
|
|
||||||
You got this mail because you enable mail notifications for this in TimeLimit.
|
You got this mail because you enable mail notifications for this in TimeLimit.
|
||||||
You can disable getting these messages in the TimeLimit App.
|
You can disable getting these messages in the TimeLimit App.
|
||||||
If you have got any questions, then you can reply to this messagge.
|
If you have got any questions, then you can reply to this message.
|
||||||
|
|
||||||
<C> <%- mailimprint %>
|
<C> <%- mailimprint %>
|
||||||
|
|||||||
+75
-172
@@ -2,8 +2,9 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title> </title>
|
<title>
|
||||||
<!--[if !mso]><!-- -->
|
</title>
|
||||||
|
<!--[if !mso]><!-->
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<!--<![endif]-->
|
<!--<![endif]-->
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
@@ -42,20 +43,20 @@
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<!--[if mso]>
|
<!--[if mso]>
|
||||||
|
<noscript>
|
||||||
<xml>
|
<xml>
|
||||||
<o:OfficeDocumentSettings>
|
<o:OfficeDocumentSettings>
|
||||||
<o:AllowPNG/>
|
<o:AllowPNG/>
|
||||||
<o:PixelsPerInch>96</o:PixelsPerInch>
|
<o:PixelsPerInch>96</o:PixelsPerInch>
|
||||||
</o:OfficeDocumentSettings>
|
</o:OfficeDocumentSettings>
|
||||||
</xml>
|
</xml>
|
||||||
|
</noscript>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
<!--[if lte mso 11]>
|
<!--[if lte mso 11]>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.mj-outlook-group-fix { width:100% !important; }
|
.mj-outlook-group-fix { width:100% !important; }
|
||||||
</style>
|
</style>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
<!--[if !mso]><!-->
|
|
||||||
<!--<![endif]-->
|
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@media only screen and (min-width:480px) {
|
@media only screen and (min-width:480px) {
|
||||||
.mj-column-per-100 {
|
.mj-column-per-100 {
|
||||||
@@ -64,223 +65,125 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
<style media="screen and (min-width:480px)">
|
||||||
|
.moz-text-html .mj-column-per-100 {
|
||||||
|
width: 100% !important;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body style="word-spacing:normal;">
|
||||||
<div style="">
|
<div style="">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" bgcolor="#009688" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="background:#009688;background-color:#009688;margin:0px auto;max-width:600px;">
|
<div style="background:#009688;background-color:#009688;margin:0px auto;max-width:600px;">
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#009688;background-color:#009688;width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="background:#009688;background-color:#009688;width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;line-height:1;text-align:left;color:#ffffff;">TimeLimit</div>
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
</td>
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;line-height:1;text-align:left;color:#ffffff;">TimeLimit</div>
|
||||||
</tr>
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="margin:0px auto;max-width:600px;">
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
<p> TimeLimit wurde vom Gerät
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
<%= deviceName %> entfernt. Ein Zurücksetzen der App, wonach diese immer noch "da", aber nicht eingerichtet ist, zählt auch als Entfernen. In jedem Fall wurde diese Aktion durch den Benutzer des Gerätes durchgeführt - in der Voreinstellung kann
|
<p> TimeLimit wurde vom Gerät <b><%= deviceName %></b> entfernt. Ein Zurücksetzen der App, wonach diese immer noch "da", aber nicht eingerichtet ist, zählt auch als Entfernen. In jedem Fall wurde diese Aktion durch den Benutzer des Gerätes durchgeführt - in der Voreinstellung kann TimeLimit jederzeit, auch durch das Kind, entfernt werden. Technisch bedingt wird nicht jede Entfernung erkannt, sodass nicht in jedem Fall diese Benachrichtigung kommt. </p>
|
||||||
TimeLimit jederzeit, auch durch das Kind, entfernt werden. Technisch bedingt wird nicht jede Entfernung erkannt, sodass nicht in jedem Fall diese Benachrichtigung kommt. </p>
|
<p> TimeLimit was removed from <b><%= deviceName %></b>. A reset of the App, after which it is still "there", but not set up, is considered a removal, too. In any case, this was done by the user of the device. Remember that by default, it is always possible to remove TimeLimit, for parents and children. For technical reasons, not every removal can be detected, so that you will not always get this notifications. </p>
|
||||||
<p> TimeLimit was removed from
|
</div>
|
||||||
<%= deviceName %>. A reset of the App, after which it is still "there", but not set up, is considered a removal, too. In any case, this was done by the user of the device. Remember that by default, it is always possible to remove TimeLimit, for
|
</td>
|
||||||
parents and children. For technical reasons, not every removal can be detected, so that you will not always get this notifications. </p>
|
</tr>
|
||||||
</div>
|
</tbody>
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="margin:0px auto;max-width:600px;">
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
<tr>
|
<tbody>
|
||||||
<td style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
<tr>
|
||||||
<p style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:100%;"> </p>
|
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
<!--[if mso | IE]>
|
<p style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:100%;">
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:550px;" role="presentation" width="550px"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="height:0;line-height:0;">
|
|
||||||
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!--[if mso | IE]>
|
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!--[if mso | IE]>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table
|
|
||||||
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
|
|
||||||
>
|
|
||||||
<tr>
|
|
||||||
<td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
|
|
||||||
<![endif]-->
|
|
||||||
<div style="margin:0px auto;max-width:600px;">
|
|
||||||
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
|
||||||
<!--[if mso | IE]>
|
|
||||||
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
|
|
||||||
<td
|
|
||||||
class="" style="vertical-align:top;width:600px;"
|
|
||||||
>
|
|
||||||
<![endif]-->
|
|
||||||
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
|
||||||
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
|
||||||
<tr>
|
|
||||||
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
|
||||||
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
|
||||||
<p> Sie erhalten diese Nachricht, weil Sie E-Mail-Benachrichtigungen in TimeLimit aktiviert haben. Sie können die Nachrichten in der TimeLimit-App abbestellen, oder indem Sie auf diese Nachricht antworten, dass Sie diese Benachrichtigungen
|
|
||||||
nicht mehr erhalten möchten. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten. </p>
|
|
||||||
<p> You got this mail because you enable mail notifications for this in TimeLimit. You can disable getting these messages in the TimeLimit App or by replying to this message that you don't want to get these notifications anymore. If
|
|
||||||
you have got any questions, then you can reply to this messagge. </p>
|
|
||||||
<p> ©
|
|
||||||
<%= mailimprint %>
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
<!--[if mso | IE]><table align="center" border="0" cellpadding="0" cellspacing="0" style="border-top:dashed 1px lightgrey;font-size:1px;margin:0px auto;width:550px;" role="presentation" width="550px" ><tr><td style="height:0;line-height:0;">
|
||||||
</td>
|
</td></tr></table><![endif]-->
|
||||||
</tr>
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
<![endif]-->
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!--[if mso | IE]>
|
<!--[if mso | IE]></td></tr></table><table align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600" ><tr><td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;"><![endif]-->
|
||||||
</td>
|
<div style="margin:0px auto;max-width:600px;">
|
||||||
</tr>
|
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
|
||||||
|
<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->
|
||||||
|
<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
|
||||||
|
<div style="font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:13px;line-height:1;text-align:left;color:#000000;">
|
||||||
|
<p> Sie erhalten diese Nachricht, weil Sie E-Mail-Benachrichtigungen in TimeLimit aktiviert haben. Sie können die Nachrichten in der TimeLimit-App abbestellen, oder indem Sie auf diese Nachricht antworten, dass Sie diese Benachrichtigungen nicht mehr erhalten möchten. Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten. </p>
|
||||||
|
<p> You got this mail because you enable mail notifications for this in TimeLimit. You can disable getting these messages in the TimeLimit App or by replying to this message that you don't want to get these notifications anymore. If you have got any questions, then you can reply to this message. </p>
|
||||||
|
<p> © <%= mailimprint %> </p>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<![endif]-->
|
</div>
|
||||||
|
<!--[if mso | IE]></td></tr></table><![endif]-->
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<mj-column>
|
<mj-column>
|
||||||
<mj-text>
|
<mj-text>
|
||||||
<p>
|
<p>
|
||||||
TimeLimit wurde vom Gerät <%= deviceName %> entfernt. Ein Zurücksetzen der
|
TimeLimit wurde vom Gerät <b><%= deviceName %></b> entfernt. Ein Zurücksetzen der
|
||||||
App, wonach diese immer noch "da", aber nicht eingerichtet ist, zählt auch als Entfernen.
|
App, wonach diese immer noch "da", aber nicht eingerichtet ist, zählt auch als Entfernen.
|
||||||
In jedem Fall wurde diese Aktion durch den Benutzer des Gerätes durchgeführt -
|
In jedem Fall wurde diese Aktion durch den Benutzer des Gerätes durchgeführt -
|
||||||
in der Voreinstellung kann TimeLimit jederzeit, auch durch das Kind, entfernt werden.
|
in der Voreinstellung kann TimeLimit jederzeit, auch durch das Kind, entfernt werden.
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
TimeLimit was removed from <%= deviceName %>. A reset of the App, after which it is
|
TimeLimit was removed from <b><%= deviceName %></b>. A reset of the App, after which it is
|
||||||
still "there", but not set up, is considered a removal, too. In any case, this was
|
still "there", but not set up, is considered a removal, too. In any case, this was
|
||||||
done by the user of the device. Remember that by default, it is always possible
|
done by the user of the device. Remember that by default, it is always possible
|
||||||
to remove TimeLimit, for parents and children. For technical reasons, not every
|
to remove TimeLimit, for parents and children. For technical reasons, not every
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
You got this mail because you enable mail notifications for this in TimeLimit.
|
You got this mail because you enable mail notifications for this in TimeLimit.
|
||||||
You can disable getting these messages in the TimeLimit App or by
|
You can disable getting these messages in the TimeLimit App or by
|
||||||
replying to this message that you don't want to get these notifications anymore.
|
replying to this message that you don't want to get these notifications anymore.
|
||||||
If you have got any questions, then you can reply to this messagge.
|
If you have got any questions, then you can reply to this message.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
© <%= mailimprint %>
|
© <%= mailimprint %>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
<%= subject %>
|
<%- subject %>
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
TimeLimit wurde vom Gerät <%= deviceName %> entfernt. Ein Zurücksetzen der
|
TimeLimit wurde vom Gerät <%- deviceName %> entfernt. Ein Zurücksetzen der
|
||||||
App, wonach diese immer noch "da", aber nicht eingerichtet ist, zählt auch als Entfernen.
|
App, wonach diese immer noch "da", aber nicht eingerichtet ist, zählt auch als Entfernen.
|
||||||
In jedem Fall wurde diese Aktion durch den Benutzer des Gerätes durchgeführt -
|
In jedem Fall wurde diese Aktion durch den Benutzer des Gerätes durchgeführt -
|
||||||
in der Voreinstellung kann TimeLimit jederzeit, auch durch das Kind, entfernt werden.
|
in der Voreinstellung kann TimeLimit jederzeit, auch durch das Kind, entfernt werden.
|
||||||
Technisch bedingt wird nicht jede Entfernung erkannt, sodass nicht in jedem Fall diese
|
Technisch bedingt wird nicht jede Entfernung erkannt, sodass nicht in jedem Fall diese
|
||||||
Benachrichtigung kommt.
|
Benachrichtigung kommt.
|
||||||
|
|
||||||
TimeLimit was removed from <%= deviceName %>. A reset of the App, after which it is
|
TimeLimit was removed from <%- deviceName %>. A reset of the App, after which it is
|
||||||
still "there", but not set up, is considered a removal, too. In any case, this was
|
still "there", but not set up, is considered a removal, too. In any case, this was
|
||||||
done by the user of the device. Remember that by default, it is always possible
|
done by the user of the device. Remember that by default, it is always possible
|
||||||
to remove TimeLimit, for parents and children. For technical reasons, not every
|
to remove TimeLimit, for parents and children. For technical reasons, not every
|
||||||
@@ -21,6 +21,6 @@ Falls Sie Fragen haben können Sie einfach auf diese E-Mail antworten.
|
|||||||
You got this mail because you enable mail notifications for this in TimeLimit.
|
You got this mail because you enable mail notifications for this in TimeLimit.
|
||||||
You can disable getting these messages in the TimeLimit App or by
|
You can disable getting these messages in the TimeLimit App or by
|
||||||
replying to this message that you don't want to get these notifications anymore.
|
replying to this message that you don't want to get these notifications anymore.
|
||||||
If you have got any questions, then you can reply to this messagge.
|
If you have got any questions, then you can reply to this message.
|
||||||
|
|
||||||
<C> <%= mailimprint %>
|
<C> <%- mailimprint %>
|
||||||
|
|||||||
Generated
+17928
-2554
File diff suppressed because it is too large
Load Diff
+13
-11
@@ -6,8 +6,8 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./build/index.js",
|
"start": "node ./build/index.js",
|
||||||
"test": "node scripts/test-launch-with-different-databases.js",
|
"test": "node scripts/test-launch-with-different-databases.js",
|
||||||
"lint": "tslint --project .",
|
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
|
||||||
"lint:fix": "tslint --project . --fix",
|
"lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix",
|
||||||
"build": "npm run build:clean && npm run build:json && npm run build:ts && npm run lint && npm run build:doc",
|
"build": "npm run build:clean && npm run build:json && npm run build:ts && npm run lint && npm run build:doc",
|
||||||
"build:clean": "rimraf build",
|
"build:clean": "rimraf build",
|
||||||
"build:json": "node ./scripts/build-schemas.js",
|
"build:json": "node ./scripts/build-schemas.js",
|
||||||
@@ -32,19 +32,20 @@
|
|||||||
"@adobe/jsonschema2md": "^6.0.3",
|
"@adobe/jsonschema2md": "^6.0.3",
|
||||||
"@types/basic-auth": "^1.1.3",
|
"@types/basic-auth": "^1.1.3",
|
||||||
"@types/body-parser": "^1.19.0",
|
"@types/body-parser": "^1.19.0",
|
||||||
"@types/email-templates": "^8.0.0",
|
"@types/ejs": "^3.1.0",
|
||||||
"@types/express": "^4.17.9",
|
"@types/express": "^4.17.9",
|
||||||
"@types/http-errors": "^1.8.0",
|
"@types/http-errors": "^1.8.0",
|
||||||
"@types/lodash": "^4.14.166",
|
"@types/lodash": "^4.14.166",
|
||||||
"@types/node": "^14.14.16",
|
"@types/node": "^14.14.16",
|
||||||
"@types/socket.io": "^2.1.12",
|
"@types/nodemailer": "^6.4.4",
|
||||||
"@types/tokgen": "^1.0.0",
|
"@types/tokgen": "^1.0.0",
|
||||||
"@types/umzug": "^2.3.0",
|
"@types/umzug": "^2.3.0",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
||||||
|
"@typescript-eslint/parser": "^5.10.0",
|
||||||
|
"eslint": "^8.7.0",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"tslint": "^6.1.3",
|
"typescript": "^4.4.4",
|
||||||
"tslint-config-standard": "^9.0.0",
|
"typescript-json-schema": "^0.52.0"
|
||||||
"typescript": "^4.1.3",
|
|
||||||
"typescript-json-schema": "^0.46.0"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ajv": "^7.0.2",
|
"ajv": "^7.0.2",
|
||||||
@@ -52,21 +53,22 @@
|
|||||||
"body-parser": "^1.19.0",
|
"body-parser": "^1.19.0",
|
||||||
"ejs": "^3.1.5",
|
"ejs": "^3.1.5",
|
||||||
"email-addresses": "^3.1.0",
|
"email-addresses": "^3.1.0",
|
||||||
"email-templates": "^8.0.2",
|
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"http-errors": "^1.8.0",
|
"http-errors": "^1.8.0",
|
||||||
"iab_verifier": "^0.1.2",
|
"iab_verifier": "^0.1.2",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"mariadb": "^2.5.2",
|
"mariadb": "^2.5.2",
|
||||||
|
"nodemailer": "^6.7.2",
|
||||||
"pg": "^8.5.1",
|
"pg": "^8.5.1",
|
||||||
"pg-hstore": "^2.3.3",
|
"pg-hstore": "^2.3.3",
|
||||||
"rate-limiter-flexible": "^2.1.15",
|
"rate-limiter-flexible": "^2.1.15",
|
||||||
"sequelize": "^6.3.5",
|
"sequelize": "^6.11.0",
|
||||||
"socket.io": "^4.0.1",
|
"socket.io": "^4.0.1",
|
||||||
|
"sqlite3": "^4.0.0",
|
||||||
"tokgen": "^1.0.0",
|
"tokgen": "^1.0.0",
|
||||||
"umzug": "^2.3.0"
|
"umzug": "^2.3.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"sqlite3": "^4.0.6"
|
"sqlite3": "^4.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ types.forEach((type) => {
|
|||||||
const functionBody = 'ajv.compile(' + schemaString + ')'
|
const functionBody = 'ajv.compile(' + schemaString + ')'
|
||||||
const functionName = 'is' + type.substr(0, 1).toUpperCase() + type.substr(1)
|
const functionName = 'is' + type.substr(0, 1).toUpperCase() + type.substr(1)
|
||||||
|
|
||||||
output += 'export const ' + functionName + ': (value: object) => value is ' + type + ' = ' + functionBody + '\n'
|
output += 'export const ' + functionName + ': (value: unknown) => value is ' + type + ' = ' + functionBody + '\n'
|
||||||
})
|
})
|
||||||
|
|
||||||
allTypes.forEach((type) => {
|
allTypes.forEach((type) => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -18,13 +18,11 @@
|
|||||||
import { ChildAction } from './basetypes'
|
import { ChildAction } from './basetypes'
|
||||||
|
|
||||||
export class ChildSignInAction extends ChildAction {
|
export class ChildSignInAction extends ChildAction {
|
||||||
|
static instance = new ChildSignInAction()
|
||||||
|
|
||||||
constructor () {
|
constructor () {
|
||||||
super()
|
super()
|
||||||
}
|
}
|
||||||
|
|
||||||
static parse = (_: SerializedChildSignInAction) => (
|
|
||||||
new ChildSignInAction()
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SerializedChildSignInAction {
|
export interface SerializedChildSignInAction {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -23,8 +23,6 @@ export class ForceSyncAction extends AppLogicAction {
|
|||||||
private constructor () {
|
private constructor () {
|
||||||
super()
|
super()
|
||||||
}
|
}
|
||||||
|
|
||||||
static parse = (_: SerializedForceSyncAction) => ForceSyncAction.instance
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SerializedForceSyncAction {
|
export interface SerializedForceSyncAction {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -24,11 +24,13 @@ export class ReviewChildTaskAction extends ParentAction {
|
|||||||
readonly taskId: string
|
readonly taskId: string
|
||||||
readonly ok: boolean
|
readonly ok: boolean
|
||||||
readonly time: number
|
readonly time: number
|
||||||
|
readonly day?: number
|
||||||
|
|
||||||
constructor ({ taskId, ok, time }: {
|
constructor ({ taskId, ok, time, day }: {
|
||||||
taskId: string
|
taskId: string
|
||||||
ok: boolean
|
ok: boolean
|
||||||
time: number
|
time: number
|
||||||
|
day?: number
|
||||||
}) {
|
}) {
|
||||||
super()
|
super()
|
||||||
|
|
||||||
@@ -39,13 +41,22 @@ export class ReviewChildTaskAction extends ParentAction {
|
|||||||
throwOutOfRange({ actionType, field: 'time', value: time })
|
throwOutOfRange({ actionType, field: 'time', value: time })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (day !== undefined) {
|
||||||
|
assertSafeInteger({ actionType, field: 'day', value: day })
|
||||||
|
|
||||||
|
if (day < 0) {
|
||||||
|
throwOutOfRange({ actionType, field: 'day', value: day })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.taskId = taskId
|
this.taskId = taskId
|
||||||
this.ok = ok
|
this.ok = ok
|
||||||
this.time = time
|
this.time = time
|
||||||
|
this.day = day
|
||||||
}
|
}
|
||||||
|
|
||||||
static parse = ({ taskId, ok, time }: SerializedReviewChildTaskAction) => (
|
static parse = ({ taskId, ok, time, day }: SerializedReviewChildTaskAction) => (
|
||||||
new ReviewChildTaskAction({ taskId, ok, time })
|
new ReviewChildTaskAction({ taskId, ok, time, day })
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,4 +65,5 @@ export interface SerializedReviewChildTaskAction {
|
|||||||
taskId: string
|
taskId: string
|
||||||
ok: boolean
|
ok: boolean
|
||||||
time: number
|
time: number
|
||||||
|
day?: number
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -48,13 +48,13 @@ export const parseAppLogicAction = (serialized: SerializedAppLogicAction): AppLo
|
|||||||
} else if (serialized.type === 'ADD_INSTALLED_APPS') {
|
} else if (serialized.type === 'ADD_INSTALLED_APPS') {
|
||||||
return AddInstalledAppsAction.parse(serialized)
|
return AddInstalledAppsAction.parse(serialized)
|
||||||
} else if (serialized.type === 'FORCE_SYNC') {
|
} else if (serialized.type === 'FORCE_SYNC') {
|
||||||
return ForceSyncAction.parse(serialized)
|
return ForceSyncAction.instance
|
||||||
} else if (serialized.type === 'MARK_TASK_PENDING') {
|
} else if (serialized.type === 'MARK_TASK_PENDING') {
|
||||||
return MarkTaskPendingAction.parse(serialized)
|
return MarkTaskPendingAction.parse(serialized)
|
||||||
} else if (serialized.type === 'REMOVE_INSTALLED_APPS') {
|
} else if (serialized.type === 'REMOVE_INSTALLED_APPS') {
|
||||||
return RemoveInstalledAppsAction.parse(serialized)
|
return RemoveInstalledAppsAction.parse(serialized)
|
||||||
} else if (serialized.type === 'SIGN_OUT_AT_DEVICE') {
|
} else if (serialized.type === 'SIGN_OUT_AT_DEVICE') {
|
||||||
return SignOutAtDeviceAction.parse(serialized)
|
return SignOutAtDeviceAction.instance
|
||||||
} else if (serialized.type === 'TRIED_DISABLING_DEVICE_ADMIN') {
|
} else if (serialized.type === 'TRIED_DISABLING_DEVICE_ADMIN') {
|
||||||
return new TriedDisablingDeviceAdminAction()
|
return new TriedDisablingDeviceAdminAction()
|
||||||
} else if (serialized.type === 'UPDATE_APP_ACTIVITIES') {
|
} else if (serialized.type === 'UPDATE_APP_ACTIVITIES') {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -25,7 +25,7 @@ export const parseChildAction = (serialized: SerializedChildAction) => {
|
|||||||
if (serialized.type === 'CHILD_CHANGE_PASSWORD') {
|
if (serialized.type === 'CHILD_CHANGE_PASSWORD') {
|
||||||
return ChildChangePasswordAction.parse(serialized)
|
return ChildChangePasswordAction.parse(serialized)
|
||||||
} else if (serialized.type === 'CHILD_SIGN_IN') {
|
} else if (serialized.type === 'CHILD_SIGN_IN') {
|
||||||
return ChildSignInAction.parse(serialized)
|
return ChildSignInAction.instance
|
||||||
} else {
|
} else {
|
||||||
throw new UnknownActionTypeException({ group: 'child' })
|
throw new UnknownActionTypeException({ group: 'child' })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,8 +23,6 @@ export class SignOutAtDeviceAction extends AppLogicAction {
|
|||||||
private constructor () {
|
private constructor () {
|
||||||
super()
|
super()
|
||||||
}
|
}
|
||||||
|
|
||||||
static parse = (_: SerializedSignOutAtDeviceAction) => SignOutAtDeviceAction.instance
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SerializedSignOutAtDeviceAction {
|
export interface SerializedSignOutAtDeviceAction {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -16,25 +16,43 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { ParentAction } from './basetypes'
|
import { ParentAction } from './basetypes'
|
||||||
import { assertIdWithinFamily } from './meta/util'
|
import { assertIdWithinFamily, assertSafeInteger, throwOutOfRange } from './meta/util'
|
||||||
|
|
||||||
const actionType = 'UpdateCategoryBlockAllNotificationsAction'
|
const actionType = 'UpdateCategoryBlockAllNotificationsAction'
|
||||||
|
|
||||||
export class UpdateCategoryBlockAllNotificationsAction extends ParentAction {
|
export class UpdateCategoryBlockAllNotificationsAction extends ParentAction {
|
||||||
readonly categoryId: string
|
readonly categoryId: string
|
||||||
readonly blocked: boolean
|
readonly blocked: boolean
|
||||||
|
readonly blockDelay: number | undefined
|
||||||
|
|
||||||
constructor ({ categoryId, blocked }: {categoryId: string, blocked: boolean}) {
|
constructor ({ categoryId, blocked, blockDelay }: {
|
||||||
|
categoryId: string
|
||||||
|
blocked: boolean
|
||||||
|
blockDelay: number | undefined
|
||||||
|
}) {
|
||||||
super()
|
super()
|
||||||
|
|
||||||
assertIdWithinFamily({ actionType, field: 'categoryId', value: categoryId })
|
assertIdWithinFamily({ actionType, field: 'categoryId', value: categoryId })
|
||||||
|
|
||||||
|
if (blockDelay !== undefined) {
|
||||||
|
assertSafeInteger({ actionType, field: 'blockDelay', value: blockDelay })
|
||||||
|
|
||||||
|
if (blockDelay < 0) {
|
||||||
|
throwOutOfRange({ actionType, field: 'blockDelay', value: blockDelay })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.categoryId = categoryId
|
this.categoryId = categoryId
|
||||||
this.blocked = blocked
|
this.blocked = blocked
|
||||||
|
this.blockDelay = blockDelay
|
||||||
}
|
}
|
||||||
|
|
||||||
static parse = ({ categoryId, blocked }: SerializedUpdateCategoryBlockAllNotificationsAction) => (
|
static parse = ({ categoryId, blocked, blockDelay }: SerializedUpdateCategoryBlockAllNotificationsAction) => (
|
||||||
new UpdateCategoryBlockAllNotificationsAction({ categoryId, blocked })
|
new UpdateCategoryBlockAllNotificationsAction({
|
||||||
|
categoryId,
|
||||||
|
blocked,
|
||||||
|
blockDelay: blockDelay
|
||||||
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,4 +60,5 @@ export interface SerializedUpdateCategoryBlockAllNotificationsAction {
|
|||||||
type: 'UPDATE_CATEGORY_BLOCK_ALL_NOTIFICATIONS'
|
type: 'UPDATE_CATEGORY_BLOCK_ALL_NOTIFICATIONS'
|
||||||
categoryId: string
|
categoryId: string
|
||||||
blocked: boolean
|
blocked: boolean
|
||||||
|
blockDelay: number | undefined
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -48,6 +48,7 @@ export const createAuthRouter = (database: Database) => {
|
|||||||
} else {
|
} else {
|
||||||
const { mailLoginToken } = await sendLoginCode({
|
const { mailLoginToken } = await sendLoginCode({
|
||||||
mail,
|
mail,
|
||||||
|
deviceAuthToken: req.body.deviceAuthToken,
|
||||||
locale: req.body.locale,
|
locale: req.body.locale,
|
||||||
database
|
database
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ export interface RequestWithAuthToken {
|
|||||||
export interface SendMailLoginCodeRequest {
|
export interface SendMailLoginCodeRequest {
|
||||||
mail: string
|
mail: string
|
||||||
locale: string
|
locale: string
|
||||||
|
deviceAuthToken?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SignInByMailCodeRequest {
|
export interface SignInByMailCodeRequest {
|
||||||
|
|||||||
+35
-55
@@ -589,6 +589,9 @@ const definitions = {
|
|||||||
},
|
},
|
||||||
"time": {
|
"time": {
|
||||||
"type": "number"
|
"type": "number"
|
||||||
|
},
|
||||||
|
"day": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@@ -940,6 +943,9 @@ const definitions = {
|
|||||||
},
|
},
|
||||||
"blocked": {
|
"blocked": {
|
||||||
"type": "boolean"
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"blockDelay": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@@ -1498,16 +1504,7 @@ const definitions = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"additionalItems": {
|
"maxItems": 2
|
||||||
"anyOf": [
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sdl": {
|
"sdl": {
|
||||||
@@ -1529,22 +1526,7 @@ const definitions = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"minItems": 4,
|
"minItems": 4,
|
||||||
"additionalItems": {
|
"maxItems": 4
|
||||||
"anyOf": [
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "number"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1675,16 +1657,7 @@ const definitions = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"additionalItems": {
|
"maxItems": 2
|
||||||
"anyOf": [
|
|
||||||
{
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"updatedOrAdded": {
|
"updatedOrAdded": {
|
||||||
@@ -2081,11 +2054,15 @@ const definitions = {
|
|||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"type": "number"
|
"type": "number"
|
||||||
|
},
|
||||||
|
"blockNotificationDelay": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"required": [
|
"required": [
|
||||||
"blockAllNotifications",
|
"blockAllNotifications",
|
||||||
|
"blockNotificationDelay",
|
||||||
"blockedTimes",
|
"blockedTimes",
|
||||||
"categoryId",
|
"categoryId",
|
||||||
"childId",
|
"childId",
|
||||||
@@ -2449,7 +2426,7 @@ const definitions = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const isClientPushChangesRequest: (value: object) => value is ClientPushChangesRequest = ajv.compile({
|
export const isClientPushChangesRequest: (value: unknown) => value is ClientPushChangesRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"deviceAuthToken": {
|
"deviceAuthToken": {
|
||||||
@@ -2470,7 +2447,7 @@ export const isClientPushChangesRequest: (value: object) => value is ClientPushC
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isClientPullChangesRequest: (value: object) => value is ClientPullChangesRequest = ajv.compile({
|
export const isClientPullChangesRequest: (value: unknown) => value is ClientPullChangesRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"deviceAuthToken": {
|
"deviceAuthToken": {
|
||||||
@@ -2488,7 +2465,7 @@ export const isClientPullChangesRequest: (value: object) => value is ClientPullC
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isMailAuthTokenRequestBody: (value: object) => value is MailAuthTokenRequestBody = ajv.compile({
|
export const isMailAuthTokenRequestBody: (value: unknown) => value is MailAuthTokenRequestBody = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"mailAuthToken": {
|
"mailAuthToken": {
|
||||||
@@ -2502,7 +2479,7 @@ export const isMailAuthTokenRequestBody: (value: object) => value is MailAuthTok
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isCreateFamilyByMailTokenRequest: (value: object) => value is CreateFamilyByMailTokenRequest = ajv.compile({
|
export const isCreateFamilyByMailTokenRequest: (value: unknown) => value is CreateFamilyByMailTokenRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"mailAuthToken": {
|
"mailAuthToken": {
|
||||||
@@ -2536,7 +2513,7 @@ export const isCreateFamilyByMailTokenRequest: (value: object) => value is Creat
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isSignIntoFamilyRequest: (value: object) => value is SignIntoFamilyRequest = ajv.compile({
|
export const isSignIntoFamilyRequest: (value: unknown) => value is SignIntoFamilyRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"mailAuthToken": {
|
"mailAuthToken": {
|
||||||
@@ -2558,7 +2535,7 @@ export const isSignIntoFamilyRequest: (value: object) => value is SignIntoFamily
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isRecoverParentPasswordRequest: (value: object) => value is RecoverParentPasswordRequest = ajv.compile({
|
export const isRecoverParentPasswordRequest: (value: unknown) => value is RecoverParentPasswordRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"mailAuthToken": {
|
"mailAuthToken": {
|
||||||
@@ -2576,7 +2553,7 @@ export const isRecoverParentPasswordRequest: (value: object) => value is Recover
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isRegisterChildDeviceRequest: (value: object) => value is RegisterChildDeviceRequest = ajv.compile({
|
export const isRegisterChildDeviceRequest: (value: unknown) => value is RegisterChildDeviceRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"registerToken": {
|
"registerToken": {
|
||||||
@@ -2598,7 +2575,7 @@ export const isRegisterChildDeviceRequest: (value: object) => value is RegisterC
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isSerializedParentAction: (value: object) => value is SerializedParentAction = ajv.compile({
|
export const isSerializedParentAction: (value: unknown) => value is SerializedParentAction = ajv.compile({
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
"$ref": "#/definitions/SerializedAddCategoryAppsAction"
|
"$ref": "#/definitions/SerializedAddCategoryAppsAction"
|
||||||
@@ -2745,7 +2722,7 @@ export const isSerializedParentAction: (value: object) => value is SerializedPar
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isSerializedAppLogicAction: (value: object) => value is SerializedAppLogicAction = ajv.compile({
|
export const isSerializedAppLogicAction: (value: unknown) => value is SerializedAppLogicAction = ajv.compile({
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
"$ref": "#/definitions/SerializedAddInstalledAppsAction"
|
"$ref": "#/definitions/SerializedAddInstalledAppsAction"
|
||||||
@@ -2781,7 +2758,7 @@ export const isSerializedAppLogicAction: (value: object) => value is SerializedA
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isSerializedChildAction: (value: object) => value is SerializedChildAction = ajv.compile({
|
export const isSerializedChildAction: (value: unknown) => value is SerializedChildAction = ajv.compile({
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
"$ref": "#/definitions/SerializedChildChangePasswordAction"
|
"$ref": "#/definitions/SerializedChildChangePasswordAction"
|
||||||
@@ -2793,7 +2770,7 @@ export const isSerializedChildAction: (value: object) => value is SerializedChil
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isCreateRegisterDeviceTokenRequest: (value: object) => value is CreateRegisterDeviceTokenRequest = ajv.compile({
|
export const isCreateRegisterDeviceTokenRequest: (value: unknown) => value is CreateRegisterDeviceTokenRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"deviceAuthToken": {
|
"deviceAuthToken": {
|
||||||
@@ -2815,7 +2792,7 @@ export const isCreateRegisterDeviceTokenRequest: (value: object) => value is Cre
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isCanDoPurchaseRequest: (value: object) => value is CanDoPurchaseRequest = ajv.compile({
|
export const isCanDoPurchaseRequest: (value: unknown) => value is CanDoPurchaseRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"type": {
|
"type": {
|
||||||
@@ -2837,7 +2814,7 @@ export const isCanDoPurchaseRequest: (value: object) => value is CanDoPurchaseRe
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isFinishPurchaseByGooglePlayRequest: (value: object) => value is FinishPurchaseByGooglePlayRequest = ajv.compile({
|
export const isFinishPurchaseByGooglePlayRequest: (value: unknown) => value is FinishPurchaseByGooglePlayRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"deviceAuthToken": {
|
"deviceAuthToken": {
|
||||||
@@ -2859,7 +2836,7 @@ export const isFinishPurchaseByGooglePlayRequest: (value: object) => value is Fi
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isLinkParentMailAddressRequest: (value: object) => value is LinkParentMailAddressRequest = ajv.compile({
|
export const isLinkParentMailAddressRequest: (value: unknown) => value is LinkParentMailAddressRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"mailAuthToken": {
|
"mailAuthToken": {
|
||||||
@@ -2885,7 +2862,7 @@ export const isLinkParentMailAddressRequest: (value: object) => value is LinkPar
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isUpdatePrimaryDeviceRequest: (value: object) => value is UpdatePrimaryDeviceRequest = ajv.compile({
|
export const isUpdatePrimaryDeviceRequest: (value: unknown) => value is UpdatePrimaryDeviceRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"action": {
|
"action": {
|
||||||
@@ -2911,7 +2888,7 @@ export const isUpdatePrimaryDeviceRequest: (value: object) => value is UpdatePri
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isRemoveDeviceRequest: (value: object) => value is RemoveDeviceRequest = ajv.compile({
|
export const isRemoveDeviceRequest: (value: unknown) => value is RemoveDeviceRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"deviceAuthToken": {
|
"deviceAuthToken": {
|
||||||
@@ -2937,7 +2914,7 @@ export const isRemoveDeviceRequest: (value: object) => value is RemoveDeviceRequ
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isRequestWithAuthToken: (value: object) => value is RequestWithAuthToken = ajv.compile({
|
export const isRequestWithAuthToken: (value: unknown) => value is RequestWithAuthToken = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"deviceAuthToken": {
|
"deviceAuthToken": {
|
||||||
@@ -2951,7 +2928,7 @@ export const isRequestWithAuthToken: (value: object) => value is RequestWithAuth
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isSendMailLoginCodeRequest: (value: object) => value is SendMailLoginCodeRequest = ajv.compile({
|
export const isSendMailLoginCodeRequest: (value: unknown) => value is SendMailLoginCodeRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"mail": {
|
"mail": {
|
||||||
@@ -2959,6 +2936,9 @@ export const isSendMailLoginCodeRequest: (value: object) => value is SendMailLog
|
|||||||
},
|
},
|
||||||
"locale": {
|
"locale": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
},
|
||||||
|
"deviceAuthToken": {
|
||||||
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@@ -2969,7 +2949,7 @@ export const isSendMailLoginCodeRequest: (value: object) => value is SendMailLog
|
|||||||
"definitions": definitions,
|
"definitions": definitions,
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#"
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
||||||
})
|
})
|
||||||
export const isSignInByMailCodeRequest: (value: object) => value is SignInByMailCodeRequest = ajv.compile({
|
export const isSignInByMailCodeRequest: (value: unknown) => value is SignInByMailCodeRequest = ajv.compile({
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"mailLoginToken": {
|
"mailLoginToken": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 Jonas Lochmann
|
* Copyright (C) 2019 - 2022 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -79,12 +79,12 @@ export class VisibleConnectedDevicesManager {
|
|||||||
}): {
|
}): {
|
||||||
shutdown: () => void
|
shutdown: () => void
|
||||||
} => {
|
} => {
|
||||||
let observesDevices = new Set<string>()
|
const observesDevices = new Set<string>()
|
||||||
let devicesWithSharingEnabled = new Set<string>()
|
const devicesWithSharingEnabled = new Set<string>()
|
||||||
let connectedDevices = new Set<string>()
|
const connectedDevices = new Set<string>()
|
||||||
let sentConnectedDevices = new Set<string>()
|
const sentConnectedDevices = new Set<string>()
|
||||||
let hasShutDown = false
|
let hasShutDown = false
|
||||||
let shutdownHooks: Array<() => void> = []
|
const shutdownHooks: Array<() => void> = []
|
||||||
|
|
||||||
const shutdown = () => {
|
const shutdown = () => {
|
||||||
hasShutDown = true
|
hasShutDown = true
|
||||||
@@ -97,7 +97,7 @@ export class VisibleConnectedDevicesManager {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let result: Array<string> = []
|
const result: Array<string> = []
|
||||||
|
|
||||||
sentConnectedDevices.forEach((deviceId) => result.push(deviceId))
|
sentConnectedDevices.forEach((deviceId) => result.push(deviceId))
|
||||||
|
|
||||||
@@ -191,7 +191,7 @@ export class VisibleConnectedDevicesManager {
|
|||||||
devices.forEach(({ deviceId, showDeviceConnected }) => {
|
devices.forEach(({ deviceId, showDeviceConnected }) => {
|
||||||
addDevice({ deviceId, showDeviceConnected })
|
addDevice({ deviceId, showDeviceConnected })
|
||||||
})
|
})
|
||||||
})().catch((ex) => { /* ignore */ })
|
})().catch(() => { /* ignore */ })
|
||||||
|
|
||||||
{
|
{
|
||||||
// add all new devices + apply changes of sharing
|
// add all new devices + apply changes of sharing
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -19,18 +19,24 @@ import * as Sequelize from 'sequelize'
|
|||||||
import { authTokenColumn, timestampColumn } from './columns'
|
import { authTokenColumn, timestampColumn } from './columns'
|
||||||
import { SequelizeAttributes } from './types'
|
import { SequelizeAttributes } from './types'
|
||||||
|
|
||||||
export interface AuthTokenAttributes {
|
export interface AuthTokenAttributesVersion1 {
|
||||||
token: string
|
token: string
|
||||||
mail: string
|
mail: string
|
||||||
createdAt: string
|
createdAt: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface AuthTokenAttributesVersion2 {
|
||||||
|
locale: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type AuthTokenAttributes = AuthTokenAttributesVersion1 & AuthTokenAttributesVersion2
|
||||||
|
|
||||||
export type AuthTokenModel = Sequelize.Model<AuthTokenAttributes> & AuthTokenAttributes
|
export type AuthTokenModel = Sequelize.Model<AuthTokenAttributes> & AuthTokenAttributes
|
||||||
export type AuthTokenModelStatic = typeof Sequelize.Model & {
|
export type AuthTokenModelStatic = typeof Sequelize.Model & {
|
||||||
new (values?: object, options?: Sequelize.BuildOptions): AuthTokenModel;
|
new (values?: object, options?: Sequelize.BuildOptions): AuthTokenModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const attributes: SequelizeAttributes<AuthTokenAttributes> = {
|
export const attributesVersion1: SequelizeAttributes<AuthTokenAttributesVersion1> = {
|
||||||
token: {
|
token: {
|
||||||
...authTokenColumn,
|
...authTokenColumn,
|
||||||
primaryKey: true
|
primaryKey: true
|
||||||
@@ -45,4 +51,17 @@ export const attributes: SequelizeAttributes<AuthTokenAttributes> = {
|
|||||||
createdAt: { ...timestampColumn }
|
createdAt: { ...timestampColumn }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const attributesVersion2: SequelizeAttributes<AuthTokenAttributesVersion2> = {
|
||||||
|
locale: {
|
||||||
|
type: Sequelize.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
defaultValue: 'en'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const attributes: SequelizeAttributes<AuthTokenAttributes> = {
|
||||||
|
...attributesVersion1,
|
||||||
|
...attributesVersion2
|
||||||
|
}
|
||||||
|
|
||||||
export const createAuthtokenModel = (sequelize: Sequelize.Sequelize): AuthTokenModelStatic => sequelize.define('AuthToken', attributes) as AuthTokenModelStatic
|
export const createAuthtokenModel = (sequelize: Sequelize.Sequelize): AuthTokenModelStatic => sequelize.define('AuthToken', attributes) as AuthTokenModelStatic
|
||||||
|
|||||||
@@ -83,10 +83,15 @@ export interface CategoryAttributesVersion11 {
|
|||||||
flags: string
|
flags: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface CategoryAttributesVersion12 {
|
||||||
|
blockNotificationDelay: string
|
||||||
|
}
|
||||||
|
|
||||||
export type CategoryAttributes = CategoryAttributesVersion1 & CategoryAttributesVersion2 &
|
export type CategoryAttributes = CategoryAttributesVersion1 & CategoryAttributesVersion2 &
|
||||||
CategoryAttributesVersion3 & CategoryAttributesVersion4 & CategoryAttributesVersion5 &
|
CategoryAttributesVersion3 & CategoryAttributesVersion4 & CategoryAttributesVersion5 &
|
||||||
CategoryAttributesVersion6 & CategoryAttributesVersion7 & CategoryAttributesVersion8 &
|
CategoryAttributesVersion6 & CategoryAttributesVersion7 & CategoryAttributesVersion8 &
|
||||||
CategoryAttributesVersion9 & CategoryAttributesVersion10 & CategoryAttributesVersion11
|
CategoryAttributesVersion9 & CategoryAttributesVersion10 & CategoryAttributesVersion11 &
|
||||||
|
CategoryAttributesVersion12
|
||||||
|
|
||||||
export type CategoryModel = Sequelize.Model<CategoryAttributes> & CategoryAttributes
|
export type CategoryModel = Sequelize.Model<CategoryAttributes> & CategoryAttributes
|
||||||
export type CategoryModelStatic = typeof Sequelize.Model & {
|
export type CategoryModelStatic = typeof Sequelize.Model & {
|
||||||
@@ -232,6 +237,17 @@ export const attributesVersion11: SequelizeAttributes<CategoryAttributesVersion1
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const attributesVersion12: SequelizeAttributes<CategoryAttributesVersion12> = {
|
||||||
|
blockNotificationDelay: {
|
||||||
|
type: Sequelize.BIGINT,
|
||||||
|
allowNull: false,
|
||||||
|
defaultValue: 0,
|
||||||
|
validate: {
|
||||||
|
min: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const attributes: SequelizeAttributes<CategoryAttributes> = {
|
export const attributes: SequelizeAttributes<CategoryAttributes> = {
|
||||||
...attributesVersion1,
|
...attributesVersion1,
|
||||||
...attributesVersion2,
|
...attributesVersion2,
|
||||||
@@ -243,7 +259,8 @@ export const attributes: SequelizeAttributes<CategoryAttributes> = {
|
|||||||
...attributesVersion8,
|
...attributesVersion8,
|
||||||
...attributesVersion9,
|
...attributesVersion9,
|
||||||
...attributesVersion10,
|
...attributesVersion10,
|
||||||
...attributesVersion11
|
...attributesVersion11,
|
||||||
|
...attributesVersion12
|
||||||
}
|
}
|
||||||
|
|
||||||
export const createCategoryModel = (sequelize: Sequelize.Sequelize): CategoryModelStatic => sequelize.define('Category', attributes) as CategoryModelStatic
|
export const createCategoryModel = (sequelize: Sequelize.Sequelize): CategoryModelStatic => sequelize.define('Category', attributes) as CategoryModelStatic
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -19,7 +19,7 @@ import * as Sequelize from 'sequelize'
|
|||||||
import { authTokenColumn, timestampColumn } from './columns'
|
import { authTokenColumn, timestampColumn } from './columns'
|
||||||
import { SequelizeAttributes } from './types'
|
import { SequelizeAttributes } from './types'
|
||||||
|
|
||||||
export interface MailLoginTokenAttributes {
|
export interface MailLoginTokenAttributesVersion1 {
|
||||||
mailLoginToken: string
|
mailLoginToken: string
|
||||||
receivedCode: string
|
receivedCode: string
|
||||||
mail: string
|
mail: string
|
||||||
@@ -27,12 +27,18 @@ export interface MailLoginTokenAttributes {
|
|||||||
remainingAttempts: number
|
remainingAttempts: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface MailLoginTokenAttributesVersion2 {
|
||||||
|
locale: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export type MailLoginTokenAttributes = MailLoginTokenAttributesVersion1 & MailLoginTokenAttributesVersion2
|
||||||
|
|
||||||
export type MailLoginTokenModel = Sequelize.Model<MailLoginTokenAttributes> & MailLoginTokenAttributes
|
export type MailLoginTokenModel = Sequelize.Model<MailLoginTokenAttributes> & MailLoginTokenAttributes
|
||||||
export type MailLoginTokenModelStatic = typeof Sequelize.Model & {
|
export type MailLoginTokenModelStatic = typeof Sequelize.Model & {
|
||||||
new (values?: object, options?: Sequelize.BuildOptions): MailLoginTokenModel;
|
new (values?: object, options?: Sequelize.BuildOptions): MailLoginTokenModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const attributes: SequelizeAttributes<MailLoginTokenAttributes> = {
|
export const attributesVersion1: SequelizeAttributes<MailLoginTokenAttributesVersion1> = {
|
||||||
mailLoginToken: {
|
mailLoginToken: {
|
||||||
...authTokenColumn,
|
...authTokenColumn,
|
||||||
primaryKey: true
|
primaryKey: true
|
||||||
@@ -61,4 +67,17 @@ export const attributes: SequelizeAttributes<MailLoginTokenAttributes> = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const attributesVersion2: SequelizeAttributes<MailLoginTokenAttributesVersion2> = {
|
||||||
|
locale: {
|
||||||
|
type: Sequelize.STRING,
|
||||||
|
allowNull: false,
|
||||||
|
defaultValue: 'en'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const attributes: SequelizeAttributes<MailLoginTokenAttributes> = {
|
||||||
|
...attributesVersion1,
|
||||||
|
...attributesVersion2
|
||||||
|
}
|
||||||
|
|
||||||
export const createMailLoginTokenModel = (sequelize: Sequelize.Sequelize): MailLoginTokenModelStatic => sequelize.define('MailLoginToken', attributes) as MailLoginTokenModelStatic
|
export const createMailLoginTokenModel = (sequelize: Sequelize.Sequelize): MailLoginTokenModelStatic => sequelize.define('MailLoginToken', attributes) as MailLoginTokenModelStatic
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -86,7 +86,7 @@ const createDatabase = (sequelize: Sequelize.Sequelize): Database => ({
|
|||||||
transaction: <T> (autoCallback: (transaction: Transaction) => Promise<T>, options?: { transaction: Transaction }) => (sequelize.transaction({
|
transaction: <T> (autoCallback: (transaction: Transaction) => Promise<T>, options?: { transaction: Transaction }) => (sequelize.transaction({
|
||||||
isolationLevel: Sequelize.Transaction.ISOLATION_LEVELS.SERIALIZABLE,
|
isolationLevel: Sequelize.Transaction.ISOLATION_LEVELS.SERIALIZABLE,
|
||||||
transaction: options?.transaction
|
transaction: options?.transaction
|
||||||
}, autoCallback) as any) as Promise<T>,
|
}, autoCallback)) as Promise<T>,
|
||||||
dialect: sequelize.getDialect()
|
dialect: sequelize.getDialect()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
import { QueryInterface, Sequelize, Transaction } from 'sequelize'
|
import { QueryInterface, Sequelize, Transaction } from 'sequelize'
|
||||||
import { attributes as addDeviceTokenAttributes } from '../../adddevicetoken'
|
import { attributes as addDeviceTokenAttributes } from '../../adddevicetoken'
|
||||||
import { attributes as appAttributes } from '../../app'
|
import { attributes as appAttributes } from '../../app'
|
||||||
import { attributes as authTokenAttributes } from '../../authtoken'
|
import { attributesVersion1 as authTokenAttributes } from '../../authtoken'
|
||||||
import { attributesVersion1 as categoryAttributes } from '../../category'
|
import { attributesVersion1 as categoryAttributes } from '../../category'
|
||||||
import { attributes as categoryAppAttributes } from '../../categoryapp'
|
import { attributes as categoryAppAttributes } from '../../categoryapp'
|
||||||
import { attributesVersion1 as deviceAttributes } from '../../device'
|
import { attributesVersion1 as deviceAttributes } from '../../device'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { QueryInterface, Sequelize, Transaction } from 'sequelize'
|
import { QueryInterface, Sequelize, Transaction } from 'sequelize'
|
||||||
import { attributes as mailLoginTokenAttributes } from '../../maillogintoken'
|
import { attributesVersion1 as mailLoginTokenAttributes } from '../../maillogintoken'
|
||||||
|
|
||||||
export async function up (queryInterface: QueryInterface, sequelize: Sequelize) {
|
export async function up (queryInterface: QueryInterface, sequelize: Sequelize) {
|
||||||
await sequelize.transaction({
|
await sequelize.transaction({
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* server component for the TimeLimit App
|
||||||
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, version 3 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { QueryInterface, Sequelize, Transaction } from 'sequelize'
|
||||||
|
import { attributesVersion12 as categoryAttributes } from '../../category'
|
||||||
|
|
||||||
|
export async function up (queryInterface: QueryInterface, sequelize: Sequelize) {
|
||||||
|
await sequelize.transaction({
|
||||||
|
type: Transaction.TYPES.EXCLUSIVE
|
||||||
|
}, async (transaction) => {
|
||||||
|
await queryInterface.addColumn('Categories', 'blockNotificationDelay', {
|
||||||
|
...categoryAttributes.blockNotificationDelay
|
||||||
|
}, {
|
||||||
|
transaction
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down (queryInterface: QueryInterface, sequelize: Sequelize) {
|
||||||
|
await sequelize.transaction({
|
||||||
|
type: Transaction.TYPES.EXCLUSIVE
|
||||||
|
}, async (transaction) => {
|
||||||
|
await queryInterface.removeColumn('Categories', 'blockNotificationDelay', { transaction })
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* server component for the TimeLimit App
|
||||||
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, version 3 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { QueryInterface, Sequelize, Transaction } from 'sequelize'
|
||||||
|
import { attributesVersion2 as authTokenAttributes } from '../../authtoken'
|
||||||
|
import { attributesVersion2 as mailLoginTokenAttributes } from '../../maillogintoken'
|
||||||
|
|
||||||
|
export async function up (queryInterface: QueryInterface, sequelize: Sequelize) {
|
||||||
|
await sequelize.transaction({
|
||||||
|
type: Transaction.TYPES.EXCLUSIVE
|
||||||
|
}, async (transaction) => {
|
||||||
|
await queryInterface.addColumn('AuthTokens', 'locale', {
|
||||||
|
...authTokenAttributes.locale
|
||||||
|
}, {
|
||||||
|
transaction
|
||||||
|
})
|
||||||
|
|
||||||
|
await queryInterface.addColumn('MailLoginTokens', 'locale', {
|
||||||
|
...mailLoginTokenAttributes.locale
|
||||||
|
}, {
|
||||||
|
transaction
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down (queryInterface: QueryInterface, sequelize: Sequelize) {
|
||||||
|
await sequelize.transaction({
|
||||||
|
type: Transaction.TYPES.EXCLUSIVE
|
||||||
|
}, async (transaction) => {
|
||||||
|
await queryInterface.removeColumn('AuthTokens', 'locale', { transaction })
|
||||||
|
await queryInterface.removeColumn('MailLoginTokens', 'locale', { transaction })
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 Jonas Lochmann
|
* Copyright (C) 2019 - 2022 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
import * as Sequelize from 'sequelize'
|
import * as Sequelize from 'sequelize'
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
export type SequelizeAttributes<T extends { [key: string]: any }> = {
|
export type SequelizeAttributes<T extends { [key: string]: any }> = {
|
||||||
[P in keyof T]: Sequelize.ModelAttributeColumnOptions;
|
[P in keyof T]: Sequelize.ModelAttributeColumnOptions;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -21,7 +21,7 @@ import { Database } from '../main'
|
|||||||
|
|
||||||
export class SerializationFeatureCheckException extends Error {}
|
export class SerializationFeatureCheckException extends Error {}
|
||||||
|
|
||||||
export function shouldRetryWithException (database: Database, e: any): boolean {
|
export function shouldRetryWithException (database: Database, e: unknown): boolean {
|
||||||
if (e instanceof Sequelize.TimeoutError) return true
|
if (e instanceof Sequelize.TimeoutError) return true
|
||||||
|
|
||||||
if (!(e instanceof Sequelize.DatabaseError)) return false
|
if (!(e instanceof Sequelize.DatabaseError)) return false
|
||||||
@@ -32,10 +32,13 @@ export function shouldRetryWithException (database: Database, e: any): boolean {
|
|||||||
if (parent.message.startsWith('SQLITE_BUSY:')) return true
|
if (parent.message.startsWith('SQLITE_BUSY:')) return true
|
||||||
} else if (database.dialect === 'postgres') {
|
} else if (database.dialect === 'postgres') {
|
||||||
// 40001 = serialization_failure
|
// 40001 = serialization_failure
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
if ((parent as any).code === '40001') return true
|
if ((parent as any).code === '40001') return true
|
||||||
// 40P01 = deadlock detected
|
// 40P01 = deadlock detected
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
if ((parent as any).code === '40P01') return true
|
if ((parent as any).code === '40P01') return true
|
||||||
} else if (database.dialect === 'mariadb') {
|
} else if (database.dialect === 'mariadb') {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
const errno = (parent as any).errno
|
const errno = (parent as any).errno
|
||||||
|
|
||||||
// ER_LOCK_DEADLOCK
|
// ER_LOCK_DEADLOCK
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -19,19 +19,28 @@ import { Unauthorized } from 'http-errors'
|
|||||||
import { Database, Transaction } from '../../database'
|
import { Database, Transaction } from '../../database'
|
||||||
import { generateAuthToken } from '../../util/token'
|
import { generateAuthToken } from '../../util/token'
|
||||||
|
|
||||||
export const createAuthTokenByMailAddress = async ({ mail, database, transaction }: { mail: string, database: Database, transaction: Transaction }) => {
|
export const createAuthTokenByMailAddress = async ({
|
||||||
|
mail, database, transaction, locale
|
||||||
|
}: {
|
||||||
|
mail: string, database: Database, transaction: Transaction, locale: string
|
||||||
|
}) => {
|
||||||
const token = generateAuthToken()
|
const token = generateAuthToken()
|
||||||
|
|
||||||
await database.authtoken.create({
|
await database.authtoken.create({
|
||||||
token,
|
token,
|
||||||
mail,
|
mail,
|
||||||
createdAt: Date.now().toString()
|
createdAt: Date.now().toString(),
|
||||||
|
locale
|
||||||
}, { transaction })
|
}, { transaction })
|
||||||
|
|
||||||
return token
|
return token
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getMailByAuthToken = async ({ mailAuthToken, database, transaction }: { mailAuthToken: string, database: Database, transaction: Transaction }) => {
|
export const getMailAndLocaleByAuthToken = async ({
|
||||||
|
mailAuthToken, database, transaction, invalidate
|
||||||
|
}: {
|
||||||
|
mailAuthToken: string, database: Database, transaction: Transaction, invalidate: boolean
|
||||||
|
}) => {
|
||||||
const entry = await database.authtoken.findOne({
|
const entry = await database.authtoken.findOne({
|
||||||
where: {
|
where: {
|
||||||
token: mailAuthToken
|
token: mailAuthToken
|
||||||
@@ -40,18 +49,38 @@ export const getMailByAuthToken = async ({ mailAuthToken, database, transaction
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (entry) {
|
if (entry) {
|
||||||
return entry.mail
|
if (invalidate) {
|
||||||
|
const rowCounter = await database.authtoken.destroy({
|
||||||
|
where: {
|
||||||
|
token: mailAuthToken
|
||||||
|
},
|
||||||
|
transaction
|
||||||
|
})
|
||||||
|
|
||||||
|
if (rowCounter !== 1) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
mail: entry.mail,
|
||||||
|
locale: entry.locale
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const requireMailByAuthToken = async ({ mailAuthToken, database, transaction }: { mailAuthToken: string, database: Database, transaction: Transaction }) => {
|
export const requireMailAndLocaleByAuthToken = async ({
|
||||||
const mail = await getMailByAuthToken({ mailAuthToken, database, transaction })
|
mailAuthToken, database, transaction, invalidate
|
||||||
|
}: {
|
||||||
|
mailAuthToken: string, database: Database, transaction: Transaction, invalidate: boolean
|
||||||
|
}) => {
|
||||||
|
const result = await getMailAndLocaleByAuthToken({ mailAuthToken, database, transaction, invalidate })
|
||||||
|
|
||||||
if (!mail) {
|
if (!result) {
|
||||||
throw new Unauthorized()
|
throw new Unauthorized()
|
||||||
}
|
}
|
||||||
|
|
||||||
return mail
|
return result
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Forbidden, Gone, TooManyRequests } from 'http-errors'
|
import { Forbidden, Gone, TooManyRequests, Unauthorized } from 'http-errors'
|
||||||
import { Database } from '../../database'
|
import { Database } from '../../database'
|
||||||
import { sendAuthenticationMail } from '../../util/mail'
|
import { sendAuthenticationMail } from '../../util/mail'
|
||||||
import { areWordSequencesEqual, randomWords } from '../../util/random-words'
|
import { areWordSequencesEqual, randomWords } from '../../util/random-words'
|
||||||
@@ -23,12 +23,52 @@ import { checkMailSendLimit } from '../../util/ratelimit-authmail'
|
|||||||
import { generateAuthToken } from '../../util/token'
|
import { generateAuthToken } from '../../util/token'
|
||||||
import { createAuthTokenByMailAddress } from './index'
|
import { createAuthTokenByMailAddress } from './index'
|
||||||
|
|
||||||
export const sendLoginCode = async ({ mail, locale, database }: {
|
export const sendLoginCode = async ({ mail, deviceAuthToken, locale, database }: {
|
||||||
mail: string
|
mail: string
|
||||||
|
deviceAuthToken?: string
|
||||||
locale: string
|
locale: string
|
||||||
database: Database
|
database: Database
|
||||||
// no transaction here because this is directly called from an API endpoint
|
// no transaction here because this is directly called from an API endpoint
|
||||||
}): Promise<{ mailLoginToken: string }> => {
|
}): Promise<{ mailLoginToken: string }> => {
|
||||||
|
let deviceName = null
|
||||||
|
|
||||||
|
if (deviceAuthToken !== undefined) {
|
||||||
|
const info = await database.transaction(async (transaction) => {
|
||||||
|
const deviceEntryUnsafe = await database.device.findOne({
|
||||||
|
where: { deviceAuthToken },
|
||||||
|
attributes: ['familyId', 'name'],
|
||||||
|
transaction
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!deviceEntryUnsafe) {
|
||||||
|
throw new Unauthorized()
|
||||||
|
}
|
||||||
|
|
||||||
|
const deviceEntry = {
|
||||||
|
familyId: deviceEntryUnsafe.familyId,
|
||||||
|
name: deviceEntryUnsafe.name
|
||||||
|
}
|
||||||
|
|
||||||
|
const userEntryCounter = await database.user.count({
|
||||||
|
where: {
|
||||||
|
familyId: deviceEntry.familyId,
|
||||||
|
mail
|
||||||
|
},
|
||||||
|
transaction
|
||||||
|
})
|
||||||
|
|
||||||
|
if (userEntryCounter === 1) {
|
||||||
|
return { deviceName: deviceEntry.name }
|
||||||
|
} else {
|
||||||
|
// do not show the device name if it is from another family
|
||||||
|
// otherwise third parties could chose a part of the content of the mail
|
||||||
|
return { deviceName: null }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
deviceName = info.deviceName
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await checkMailSendLimit(mail)
|
await checkMailSendLimit(mail)
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
@@ -41,7 +81,8 @@ export const sendLoginCode = async ({ mail, locale, database }: {
|
|||||||
await sendAuthenticationMail({
|
await sendAuthenticationMail({
|
||||||
receiver: mail,
|
receiver: mail,
|
||||||
code,
|
code,
|
||||||
locale
|
locale,
|
||||||
|
deviceName
|
||||||
})
|
})
|
||||||
|
|
||||||
await database.transaction(async (transaction) => {
|
await database.transaction(async (transaction) => {
|
||||||
@@ -50,7 +91,8 @@ export const sendLoginCode = async ({ mail, locale, database }: {
|
|||||||
receivedCode: code,
|
receivedCode: code,
|
||||||
mail,
|
mail,
|
||||||
createdAt: Date.now().toString(10),
|
createdAt: Date.now().toString(10),
|
||||||
remainingAttempts: 3
|
remainingAttempts: 3,
|
||||||
|
locale
|
||||||
}, { transaction })
|
}, { transaction })
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -91,7 +133,23 @@ export const signInByMailCode = async ({ mailLoginToken, receivedCode, database
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const mailAuthToken = await createAuthTokenByMailAddress({ mail: entry.mail, database, transaction })
|
const counter = await database.mailLoginToken.destroy({
|
||||||
|
where: {
|
||||||
|
mailLoginToken
|
||||||
|
},
|
||||||
|
transaction
|
||||||
|
})
|
||||||
|
|
||||||
|
if (counter !== 1) {
|
||||||
|
throw new Gone()
|
||||||
|
}
|
||||||
|
|
||||||
|
const mailAuthToken = await createAuthTokenByMailAddress({
|
||||||
|
mail: entry.mail,
|
||||||
|
locale: entry.locale,
|
||||||
|
database,
|
||||||
|
transaction
|
||||||
|
})
|
||||||
|
|
||||||
return { mailAuthToken }
|
return { mailAuthToken }
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -22,7 +22,7 @@ import { maxMailNotificationFlags } from '../../database/user'
|
|||||||
import {
|
import {
|
||||||
generateAuthToken, generateFamilyId, generateIdWithinFamily, generateVersionId
|
generateAuthToken, generateFamilyId, generateIdWithinFamily, generateVersionId
|
||||||
} from '../../util/token'
|
} from '../../util/token'
|
||||||
import { requireMailByAuthToken } from '../authentication'
|
import { requireMailAndLocaleByAuthToken } from '../authentication'
|
||||||
import { prepareDeviceEntry } from '../device/prepare-device-entry'
|
import { prepareDeviceEntry } from '../device/prepare-device-entry'
|
||||||
|
|
||||||
export const createFamily = async ({ database, mailAuthToken, firstParentDevice, password, timeZone, parentName, deviceName }: {
|
export const createFamily = async ({ database, mailAuthToken, firstParentDevice, password, timeZone, parentName, deviceName }: {
|
||||||
@@ -37,12 +37,12 @@ export const createFamily = async ({ database, mailAuthToken, firstParentDevice,
|
|||||||
}) => {
|
}) => {
|
||||||
return database.transaction(async (transaction) => {
|
return database.transaction(async (transaction) => {
|
||||||
const now = Date.now().toString(10)
|
const now = Date.now().toString(10)
|
||||||
const mail = await requireMailByAuthToken({ database, mailAuthToken, transaction })
|
const mailInfo = await requireMailAndLocaleByAuthToken({ database, mailAuthToken, transaction, invalidate: true })
|
||||||
|
|
||||||
// ensure that no family was created for this mail yet
|
// ensure that no family was created for this mail yet
|
||||||
const exisitngUserEntry = await database.user.findOne({
|
const exisitngUserEntry = await database.user.findOne({
|
||||||
where: {
|
where: {
|
||||||
mail
|
mail: mailInfo.mail
|
||||||
},
|
},
|
||||||
transaction
|
transaction
|
||||||
})
|
})
|
||||||
@@ -77,7 +77,7 @@ export const createFamily = async ({ database, mailAuthToken, firstParentDevice,
|
|||||||
secondPasswordHash: password.secondHash,
|
secondPasswordHash: password.secondHash,
|
||||||
secondPasswordSalt: password.secondSalt,
|
secondPasswordSalt: password.secondSalt,
|
||||||
type: 'parent',
|
type: 'parent',
|
||||||
mail,
|
mail: mailInfo.mail,
|
||||||
timeZone,
|
timeZone,
|
||||||
disableTimelimitsUntil: '0',
|
disableTimelimitsUntil: '0',
|
||||||
currentDevice: '',
|
currentDevice: '',
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
import { Database, Transaction } from '../../database'
|
import { Database, Transaction } from '../../database'
|
||||||
import { StaticMessageException } from '../../exception'
|
import { StaticMessageException } from '../../exception'
|
||||||
import { requireMailByAuthToken } from '../authentication'
|
import { requireMailAndLocaleByAuthToken } from '../authentication'
|
||||||
|
|
||||||
const getStatusByMailAddress = async ({
|
const getStatusByMailAddress = async ({
|
||||||
mail, database, transaction
|
mail, database, transaction
|
||||||
@@ -43,7 +43,9 @@ const getStatusByMailAddress = async ({
|
|||||||
export const getStatusByMailToken = async ({
|
export const getStatusByMailToken = async ({
|
||||||
mailAuthToken, database, transaction
|
mailAuthToken, database, transaction
|
||||||
}: { mailAuthToken: string, database: Database, transaction: Transaction }) => {
|
}: { mailAuthToken: string, database: Database, transaction: Transaction }) => {
|
||||||
const mail = await requireMailByAuthToken({ mailAuthToken, database, transaction })
|
const mailInfo = await requireMailAndLocaleByAuthToken({ mailAuthToken, database, transaction, invalidate: false })
|
||||||
|
const mail = mailInfo.mail
|
||||||
|
|
||||||
const status = await getStatusByMailAddress({ mail, database, transaction })
|
const status = await getStatusByMailAddress({ mail, database, transaction })
|
||||||
|
|
||||||
return { mail, status }
|
return { mail, status }
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import { Conflict, Unauthorized } from 'http-errors'
|
|||||||
import { Database } from '../../database'
|
import { Database } from '../../database'
|
||||||
import { generateVersionId } from '../../util/token'
|
import { generateVersionId } from '../../util/token'
|
||||||
import { WebsocketApi } from '../../websocket'
|
import { WebsocketApi } from '../../websocket'
|
||||||
import { requireMailByAuthToken } from '../authentication'
|
import { requireMailAndLocaleByAuthToken } from '../authentication'
|
||||||
import { notifyClientsAboutChangesDelayed } from '../websocket'
|
import { notifyClientsAboutChangesDelayed } from '../websocket'
|
||||||
|
|
||||||
export const linkMailAddress = async ({ mailAuthToken, deviceAuthToken, parentUserId, parentPasswordSecondHash, database, websocket }: {
|
export const linkMailAddress = async ({ mailAuthToken, deviceAuthToken, parentUserId, parentPasswordSecondHash, database, websocket }: {
|
||||||
@@ -45,11 +45,11 @@ export const linkMailAddress = async ({ mailAuthToken, deviceAuthToken, parentUs
|
|||||||
|
|
||||||
const familyId = deviceEntry.familyId
|
const familyId = deviceEntry.familyId
|
||||||
|
|
||||||
const mailAddress = await requireMailByAuthToken({ mailAuthToken, database, transaction })
|
const mailInfo = await requireMailAndLocaleByAuthToken({ mailAuthToken, database, transaction, invalidate: true })
|
||||||
|
|
||||||
const exisitingUser = await database.user.findOne({
|
const exisitingUser = await database.user.findOne({
|
||||||
where: {
|
where: {
|
||||||
mail: mailAddress
|
mail: mailInfo.mail
|
||||||
},
|
},
|
||||||
transaction
|
transaction
|
||||||
})
|
})
|
||||||
@@ -83,7 +83,7 @@ export const linkMailAddress = async ({ mailAuthToken, deviceAuthToken, parentUs
|
|||||||
throw new Conflict()
|
throw new Conflict()
|
||||||
}
|
}
|
||||||
|
|
||||||
parentEntry.mail = mailAddress
|
parentEntry.mail = mailInfo.mail
|
||||||
|
|
||||||
await parentEntry.save({ transaction })
|
await parentEntry.save({ transaction })
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -18,9 +18,10 @@
|
|||||||
import { Conflict } from 'http-errors'
|
import { Conflict } from 'http-errors'
|
||||||
import { ParentPassword } from '../../api/schema'
|
import { ParentPassword } from '../../api/schema'
|
||||||
import { Database } from '../../database'
|
import { Database } from '../../database'
|
||||||
|
import { sendPasswordRecoveryUsedMail } from '../../util/mail'
|
||||||
import { generateVersionId } from '../../util/token'
|
import { generateVersionId } from '../../util/token'
|
||||||
import { WebsocketApi } from '../../websocket'
|
import { WebsocketApi } from '../../websocket'
|
||||||
import { requireMailByAuthToken } from '../authentication'
|
import { requireMailAndLocaleByAuthToken } from '../authentication'
|
||||||
import { notifyClientsAboutChangesDelayed } from '../websocket'
|
import { notifyClientsAboutChangesDelayed } from '../websocket'
|
||||||
|
|
||||||
export const recoverParentPassword = async ({ database, websocket, password, mailAuthToken }: {
|
export const recoverParentPassword = async ({ database, websocket, password, mailAuthToken }: {
|
||||||
@@ -31,12 +32,12 @@ export const recoverParentPassword = async ({ database, websocket, password, mai
|
|||||||
// no transaction here because this is directly called from an API endpoint
|
// no transaction here because this is directly called from an API endpoint
|
||||||
}) => {
|
}) => {
|
||||||
await database.transaction(async (transaction) => {
|
await database.transaction(async (transaction) => {
|
||||||
const mail = await requireMailByAuthToken({ mailAuthToken, database, transaction })
|
const mailInfo = await requireMailAndLocaleByAuthToken({ mailAuthToken, database, transaction, invalidate: true })
|
||||||
|
|
||||||
// update the user entry
|
// update the user entry
|
||||||
const userEntry = await database.user.findOne({
|
const userEntry = await database.user.findOne({
|
||||||
where: {
|
where: {
|
||||||
mail
|
mail: mailInfo.mail
|
||||||
},
|
},
|
||||||
transaction
|
transaction
|
||||||
})
|
})
|
||||||
@@ -69,5 +70,12 @@ export const recoverParentPassword = async ({ database, websocket, password, mai
|
|||||||
sourceDeviceId: null,
|
sourceDeviceId: null,
|
||||||
transaction
|
transaction
|
||||||
})
|
})
|
||||||
|
|
||||||
|
transaction.afterCommit(async () => {
|
||||||
|
await sendPasswordRecoveryUsedMail({
|
||||||
|
receiver: mailInfo.mail,
|
||||||
|
locale: mailInfo.locale
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -18,9 +18,10 @@
|
|||||||
import { Conflict } from 'http-errors'
|
import { Conflict } from 'http-errors'
|
||||||
import { NewDeviceInfo } from '../../api/schema'
|
import { NewDeviceInfo } from '../../api/schema'
|
||||||
import { Database } from '../../database'
|
import { Database } from '../../database'
|
||||||
|
import { sendDeviceLinkedMail } from '../../util/mail'
|
||||||
import { generateAuthToken, generateIdWithinFamily, generateVersionId } from '../../util/token'
|
import { generateAuthToken, generateIdWithinFamily, generateVersionId } from '../../util/token'
|
||||||
import { WebsocketApi } from '../../websocket'
|
import { WebsocketApi } from '../../websocket'
|
||||||
import { requireMailByAuthToken } from '../authentication'
|
import { requireMailAndLocaleByAuthToken } from '../authentication'
|
||||||
import { prepareDeviceEntry } from '../device/prepare-device-entry'
|
import { prepareDeviceEntry } from '../device/prepare-device-entry'
|
||||||
import { notifyClientsAboutChangesDelayed } from '../websocket'
|
import { notifyClientsAboutChangesDelayed } from '../websocket'
|
||||||
|
|
||||||
@@ -33,11 +34,11 @@ export const signInIntoFamily = async ({ database, mailAuthToken, newDeviceInfo,
|
|||||||
// no transaction here because this is directly called from an API endpoint
|
// no transaction here because this is directly called from an API endpoint
|
||||||
}): Promise<{ deviceId: string; deviceAuthToken: string }> => {
|
}): Promise<{ deviceId: string; deviceAuthToken: string }> => {
|
||||||
return database.transaction(async (transaction) => {
|
return database.transaction(async (transaction) => {
|
||||||
const mail = await requireMailByAuthToken({ database, mailAuthToken, transaction })
|
const mailInfo = await requireMailAndLocaleByAuthToken({ database, mailAuthToken, transaction, invalidate: true })
|
||||||
|
|
||||||
const userEntryUnsafe = await database.user.findOne({
|
const userEntryUnsafe = await database.user.findOne({
|
||||||
where: {
|
where: {
|
||||||
mail
|
mail: mailInfo.mail
|
||||||
},
|
},
|
||||||
attributes: ['familyId', 'userId'],
|
attributes: ['familyId', 'userId'],
|
||||||
transaction
|
transaction
|
||||||
@@ -84,6 +85,14 @@ export const signInIntoFamily = async ({ database, mailAuthToken, newDeviceInfo,
|
|||||||
transaction
|
transaction
|
||||||
})
|
})
|
||||||
|
|
||||||
|
transaction.afterCommit(async () => {
|
||||||
|
await sendDeviceLinkedMail({
|
||||||
|
receiver: mailInfo.mail,
|
||||||
|
locale: mailInfo.locale,
|
||||||
|
deviceName
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
deviceId,
|
deviceId,
|
||||||
deviceAuthToken
|
deviceAuthToken
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 Jonas Lochmann
|
* Copyright (C) 2019 - 2022 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
const IABVerifier: new (publicKey: string) => {
|
const IABVerifier: new (publicKey: string) => {
|
||||||
verifyReceipt: (data: string, signature: string) => boolean
|
verifyReceipt: (data: string, signature: string) => boolean
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||||
} = require('iab_verifier')
|
} = require('iab_verifier')
|
||||||
|
|
||||||
export const googlePlayPublicKey = process.env.GOOGLE_PLAY_PUBLIC_KEY || ''
|
export const googlePlayPublicKey = process.env.GOOGLE_PLAY_PUBLIC_KEY || ''
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ export async function dispatchAddUsedTimeVersion2 ({ deviceId, action, cache, ev
|
|||||||
addUsedTimeForADifferentUserThanTheCurrentUserOfTheDevice = true
|
addUsedTimeForADifferentUserThanTheCurrentUserOfTheDevice = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line:no-inner-declarations
|
// eslint-disable-next-line no-inner-declarations
|
||||||
async function handle (start: number, end: number) {
|
async function handle (start: number, end: number) {
|
||||||
const lengthInMinutes = (end - start) + 1
|
const lengthInMinutes = (end - start) + 1
|
||||||
const lengthInMs = lengthInMinutes * 1000 * 60
|
const lengthInMs = lengthInMinutes * 1000 * 60
|
||||||
@@ -199,7 +199,9 @@ export async function dispatchAddUsedTimeVersion2 ({ deviceId, action, cache, ev
|
|||||||
oldItem.roundedLastUpdate = roundedTimestampForSessionDuration
|
oldItem.roundedLastUpdate = roundedTimestampForSessionDuration
|
||||||
|
|
||||||
if (hasTrustedTimestamp) {
|
if (hasTrustedTimestamp) {
|
||||||
oldItem.lastUsage = action.trustedTimestamp.toString(10)
|
if (parseInt(oldItem.lastUsage, 10) < action.trustedTimestamp) {
|
||||||
|
oldItem.lastUsage = action.trustedTimestamp.toString(10)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await oldItem.save({ transaction: cache.transaction })
|
await oldItem.save({ transaction: cache.transaction })
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -26,7 +26,7 @@ import { parseEncodedAction } from '../parse-encoded-action'
|
|||||||
export async function dispatch<T1 extends { type: string }, T2> ({ type, action, validator, parser, applier, eventHandler }: {
|
export async function dispatch<T1 extends { type: string }, T2> ({ type, action, validator, parser, applier, eventHandler }: {
|
||||||
type: 'app logic' | 'parent' | 'child'
|
type: 'app logic' | 'parent' | 'child'
|
||||||
action: ClientPushChangesRequestAction
|
action: ClientPushChangesRequestAction
|
||||||
validator: (input: any) => input is T1
|
validator: (input: unknown) => input is T1
|
||||||
parser: (input: T1) => T2
|
parser: (input: T1) => T2
|
||||||
applier: (input: T2) => Promise<void>
|
applier: (input: T2) => Promise<void>
|
||||||
eventHandler: EventHandler
|
eventHandler: EventHandler
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -80,7 +80,8 @@ export async function dispatchCreateCategory ({ action, cache, fromChildSelfLimi
|
|||||||
taskListVersion: generateVersionId(),
|
taskListVersion: generateVersionId(),
|
||||||
minBatteryCharging: 0,
|
minBatteryCharging: 0,
|
||||||
minBatteryMobile: 0,
|
minBatteryMobile: 0,
|
||||||
flags: '0'
|
flags: '0',
|
||||||
|
blockNotificationDelay: '0'
|
||||||
}, { transaction: cache.transaction })
|
}, { transaction: cache.transaction })
|
||||||
|
|
||||||
// update the cache
|
// update the cache
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -60,10 +60,13 @@ export async function dispatchReviewChildTaskAction ({ action, cache }: {
|
|||||||
extraTimeDay: categoryInfoUnsafe.extraTimeDay
|
extraTimeDay: categoryInfoUnsafe.extraTimeDay
|
||||||
}
|
}
|
||||||
|
|
||||||
if (categoryInfo.extraTimeDay !== 0 && categoryInfo.extraTimeInMillis > 0) {
|
const resetDayBoundExtraTime = categoryInfo.extraTimeDay !== -1 &&
|
||||||
// if the current time is daily, then extend the daily time only
|
action.day !== undefined && categoryInfo.extraTimeDay !== action.day
|
||||||
|
|
||||||
|
if (resetDayBoundExtraTime) {
|
||||||
await cache.database.category.update({
|
await cache.database.category.update({
|
||||||
extraTimeInMillis: categoryInfo.extraTimeInMillis + taskInfo.extraTimeDuration
|
extraTimeInMillis: taskInfo.extraTimeDuration,
|
||||||
|
extraTimeDay: -1
|
||||||
}, {
|
}, {
|
||||||
where: {
|
where: {
|
||||||
familyId: cache.familyId,
|
familyId: cache.familyId,
|
||||||
@@ -73,8 +76,7 @@ export async function dispatchReviewChildTaskAction ({ action, cache }: {
|
|||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
await cache.database.category.update({
|
await cache.database.category.update({
|
||||||
extraTimeInMillis: categoryInfo.extraTimeInMillis + taskInfo.extraTimeDuration,
|
extraTimeInMillis: categoryInfo.extraTimeInMillis + taskInfo.extraTimeDuration
|
||||||
extraTimeDay: -1
|
|
||||||
}, {
|
}, {
|
||||||
where: {
|
where: {
|
||||||
familyId: cache.familyId,
|
familyId: cache.familyId,
|
||||||
|
|||||||
+15
-3
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2020 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -31,13 +31,18 @@ export async function dispatchUpdateCategoryBlockAllNotifications ({ action, cac
|
|||||||
categoryId: action.categoryId
|
categoryId: action.categoryId
|
||||||
},
|
},
|
||||||
transaction: cache.transaction,
|
transaction: cache.transaction,
|
||||||
attributes: ['childId']
|
attributes: ['childId', 'blockAllNotifications']
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!categoryEntryUnsafe) {
|
if (!categoryEntryUnsafe) {
|
||||||
throw new MissingCategoryException()
|
throw new MissingCategoryException()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const categoryEntry = {
|
||||||
|
childId: categoryEntryUnsafe.childId,
|
||||||
|
blockAllNotifications: categoryEntryUnsafe.blockAllNotifications
|
||||||
|
}
|
||||||
|
|
||||||
if (fromChildSelfLimitAddChildUserId !== null) {
|
if (fromChildSelfLimitAddChildUserId !== null) {
|
||||||
if (fromChildSelfLimitAddChildUserId !== categoryEntryUnsafe.childId) {
|
if (fromChildSelfLimitAddChildUserId !== categoryEntryUnsafe.childId) {
|
||||||
throw new CanNotModifyOtherUsersBySelfLimitationException()
|
throw new CanNotModifyOtherUsersBySelfLimitationException()
|
||||||
@@ -46,10 +51,17 @@ export async function dispatchUpdateCategoryBlockAllNotifications ({ action, cac
|
|||||||
if (!action.blocked) {
|
if (!action.blocked) {
|
||||||
throw new SelfLimitationException({ staticMessage: 'can not disable notification filter as child' })
|
throw new SelfLimitationException({ staticMessage: 'can not disable notification filter as child' })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (categoryEntry.blockAllNotifications && action.blockDelay !== undefined) {
|
||||||
|
throw new SelfLimitationException({ staticMessage: 'can not update the block delay as child' })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const [affectedRows] = await cache.database.category.update({
|
const [affectedRows] = await cache.database.category.update(action.blockDelay === undefined ? {
|
||||||
blockAllNotifications: action.blocked
|
blockAllNotifications: action.blocked
|
||||||
|
} : {
|
||||||
|
blockAllNotifications: action.blocked,
|
||||||
|
blockNotificationDelay: action.blockDelay.toString(10)
|
||||||
}, {
|
}, {
|
||||||
where: {
|
where: {
|
||||||
familyId: cache.familyId,
|
familyId: cache.familyId,
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ export const applyActionsFromDevice = async ({ database, request, websocket, con
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
if (shouldRetryWithException(ex, database)) {
|
if (shouldRetryWithException(database, ex)) {
|
||||||
eventHandler.countEvent('applyActionsFromDevice got exception which should cause retry')
|
eventHandler.countEvent('applyActionsFromDevice got exception which should cause retry')
|
||||||
|
|
||||||
throw ex
|
throw ex
|
||||||
|
|||||||
@@ -52,7 +52,8 @@ export async function getCategoryBaseDatas ({
|
|||||||
'temporarilyBlockedEndTime',
|
'temporarilyBlockedEndTime',
|
||||||
'sort',
|
'sort',
|
||||||
'disableLimitsUntil',
|
'disableLimitsUntil',
|
||||||
'flags'
|
'flags',
|
||||||
|
'blockNotificationDelay'
|
||||||
],
|
],
|
||||||
transaction
|
transaction
|
||||||
})).map((item) => ({
|
})).map((item) => ({
|
||||||
@@ -72,7 +73,8 @@ export async function getCategoryBaseDatas ({
|
|||||||
temporarilyBlockedEndTime: item.temporarilyBlockedEndTime,
|
temporarilyBlockedEndTime: item.temporarilyBlockedEndTime,
|
||||||
sort: item.sort,
|
sort: item.sort,
|
||||||
disableLimitsUntil: item.disableLimitsUntil,
|
disableLimitsUntil: item.disableLimitsUntil,
|
||||||
flags: item.flags
|
flags: item.flags,
|
||||||
|
blockNotificationDelay: item.blockNotificationDelay
|
||||||
}))
|
}))
|
||||||
|
|
||||||
const networkIdsForSyncing = (await database.categoryNetworkId.findAll({
|
const networkIdsForSyncing = (await database.categoryNetworkId.findAll({
|
||||||
@@ -117,6 +119,7 @@ export async function getCategoryBaseDatas ({
|
|||||||
hashedNetworkId: network.hashedNetworkId
|
hashedNetworkId: network.hashedNetworkId
|
||||||
})),
|
})),
|
||||||
dlu: parseInt(item.disableLimitsUntil, 10),
|
dlu: parseInt(item.disableLimitsUntil, 10),
|
||||||
flags: parseInt(item.flags, 10)
|
flags: parseInt(item.flags, 10),
|
||||||
|
blockNotificationDelay: parseInt(item.blockNotificationDelay, 10)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -39,11 +39,12 @@ export const generateServerDataStatus = async ({ database, clientStatus, familyI
|
|||||||
const familyEntry = await getFamilyEntry({ database, familyId, transaction })
|
const familyEntry = await getFamilyEntry({ database, familyId, transaction })
|
||||||
const doesClientSupportTasks = clientStatus.clientLevel !== undefined && clientStatus.clientLevel >= 3
|
const doesClientSupportTasks = clientStatus.clientLevel !== undefined && clientStatus.clientLevel >= 3
|
||||||
|
|
||||||
let result: ServerDataStatus = {
|
const result: ServerDataStatus = {
|
||||||
fullVersion: config.alwaysPro ? 1 : (
|
fullVersion: config.alwaysPro ? 1 : (
|
||||||
familyEntry.hasFullVersion ? parseInt(familyEntry.fullVersionUntil, 10) : 0
|
familyEntry.hasFullVersion ? parseInt(familyEntry.fullVersionUntil, 10) : 0
|
||||||
),
|
),
|
||||||
message: await getStatusMessage({ database, transaction }) || undefined
|
message: await getStatusMessage({ database, transaction }) || undefined,
|
||||||
|
apiLevel: 2
|
||||||
}
|
}
|
||||||
|
|
||||||
if (familyEntry.deviceListVersion !== clientStatus.devices) {
|
if (familyEntry.deviceListVersion !== clientStatus.devices) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -33,6 +33,7 @@ export interface ServerDataStatus {
|
|||||||
users?: ServerUserList // newUserList
|
users?: ServerUserList // newUserList
|
||||||
fullVersion: number // fullVersionUntil
|
fullVersion: number // fullVersionUntil
|
||||||
message?: string
|
message?: string
|
||||||
|
apiLevel: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ServerDeviceList {
|
export interface ServerDeviceList {
|
||||||
@@ -118,6 +119,7 @@ export interface ServerUpdatedCategoryBaseData {
|
|||||||
// disable limits until
|
// disable limits until
|
||||||
dlu: number
|
dlu: number
|
||||||
flags: number
|
flags: number
|
||||||
|
blockNotificationDelay: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ServerCategoryNetworkId {
|
export interface ServerCategoryNetworkId {
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -56,7 +56,7 @@ export const validateBitmask = (bitmask: string, maxLength: number) => {
|
|||||||
export const validateAndParseBitmask = (bitmask: string, maxLength: number) => {
|
export const validateAndParseBitmask = (bitmask: string, maxLength: number) => {
|
||||||
validateBitmask(bitmask, maxLength)
|
validateBitmask(bitmask, maxLength)
|
||||||
|
|
||||||
const result = range(0, maxLength).map((_) => false)
|
const result = range(0, maxLength).map(() => false)
|
||||||
|
|
||||||
const splitpoints = split(bitmask, ',').map((item) => parseInt(item, 10))
|
const splitpoints = split(bitmask, ',').map((item) => parseInt(item, 10))
|
||||||
|
|
||||||
|
|||||||
+139
-40
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -15,53 +15,106 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { compile } from 'ejs'
|
||||||
import { parseOneAddress } from 'email-addresses'
|
import { parseOneAddress } from 'email-addresses'
|
||||||
import * as Email from 'email-templates'
|
import { readFileSync } from 'fs'
|
||||||
import { join } from 'path'
|
import { createTransport } from 'nodemailer'
|
||||||
|
import { resolve } from 'path'
|
||||||
import { config } from '../config'
|
import { config } from '../config'
|
||||||
import { IllegalStateException } from '../exception'
|
import { IllegalStateException } from '../exception'
|
||||||
|
|
||||||
const mailimprint = process.env.MAIL_IMPRINT || 'not defined'
|
const mailimprint = process.env.MAIL_IMPRINT || 'not defined'
|
||||||
const mailServerBlacklist = (process.env.MAIL_SERVER_BLACKLIST || '').split(',').filter((item) => !!item)
|
const mailServerBlacklist = (process.env.MAIL_SERVER_BLACKLIST || '').split(',').filter((item) => !!item)
|
||||||
|
|
||||||
const email = new Email({
|
const mailSender = process.env.MAIL_SENDER || ''
|
||||||
message: {
|
const mailTransportConfig = JSON.parse(process.env.MAIL_TRANSPORT || 'null') || undefined
|
||||||
from: process.env.MAIL_SENDER || ''
|
const isDevMode = process.env.NODE_ENV === 'development'
|
||||||
},
|
|
||||||
transport: JSON.parse(process.env.MAIL_TRANSPORT || 'null') || undefined,
|
|
||||||
views: {
|
|
||||||
options: {
|
|
||||||
extension: 'ejs'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
export const sendAuthenticationMail = async ({ receiver, code, locale }: {receiver: string, code: string, locale: string}) => {
|
const mailTransport = isDevMode || mailTransportConfig !== undefined ?
|
||||||
await email.send({
|
createTransport(isDevMode ? {
|
||||||
template: join(__dirname, '../../other/mail/login'),
|
jsonTransport: true
|
||||||
message: {
|
} : mailTransportConfig) :
|
||||||
to: receiver
|
null
|
||||||
},
|
|
||||||
locals: {
|
function createMailTemplateSender (templateName: string) {
|
||||||
|
const compileTemplate = (filename: string) => compile(
|
||||||
|
readFileSync(resolve(__dirname, '../../other/mail', templateName, filename)).toString('utf8')
|
||||||
|
)
|
||||||
|
|
||||||
|
const subjectTemplate = compileTemplate('subject.ejs')
|
||||||
|
const textTemplate = compileTemplate('text.ejs')
|
||||||
|
const htmlTemplate = compileTemplate('html.ejs')
|
||||||
|
|
||||||
|
const sendMail = async ({ receiver, params }: {
|
||||||
|
receiver: string
|
||||||
|
params: object
|
||||||
|
}) => {
|
||||||
|
if (!mailTransport) {
|
||||||
|
throw new Error('can not send mails without mail config and without NODE_ENV=development')
|
||||||
|
}
|
||||||
|
|
||||||
|
const subject = subjectTemplate(params).replace(/\n/g, ' ')
|
||||||
|
const text = textTemplate(params)
|
||||||
|
const html = htmlTemplate(params)
|
||||||
|
|
||||||
|
await new Promise<void>((resolve, reject) => {
|
||||||
|
mailTransport.sendMail({
|
||||||
|
from: mailSender,
|
||||||
|
to: receiver,
|
||||||
|
subject,
|
||||||
|
text,
|
||||||
|
html
|
||||||
|
}, (err, info) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err)
|
||||||
|
} else {
|
||||||
|
if (isDevMode) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
const data = (info as any).message
|
||||||
|
|
||||||
|
console.log(JSON.stringify(JSON.parse(data), null, 2))
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return { sendMail }
|
||||||
|
}
|
||||||
|
|
||||||
|
const loginMailSender = createMailTemplateSender('login')
|
||||||
|
|
||||||
|
export const sendAuthenticationMail = async ({
|
||||||
|
receiver, code, locale, deviceName
|
||||||
|
}: {
|
||||||
|
receiver: string, code: string, locale: string, deviceName: string | null
|
||||||
|
}) => {
|
||||||
|
await loginMailSender.sendMail({
|
||||||
|
receiver,
|
||||||
|
params: {
|
||||||
subject: locale === 'de' ? 'Anmeldung bei TimeLimit' : 'Sign in at TimeLimit',
|
subject: locale === 'de' ? 'Anmeldung bei TimeLimit' : 'Sign in at TimeLimit',
|
||||||
introtext: locale === 'de' ? 'Geben Sie zum Authentifizieren folgenden Code in TimeLimit ein' : 'To authenticate, enter the following code in TimeLimit',
|
introtext: locale === 'de' ? 'Geben Sie zum Authentifizieren folgenden Code in TimeLimit ein' : 'To authenticate, enter the following code in TimeLimit',
|
||||||
code,
|
code,
|
||||||
outrotext: locale === 'de' ? 'Geben Sie diesen Code nicht an Dritte weiter.' : 'Do not share this code with third parties.',
|
outrotext: locale === 'de' ? 'Geben Sie diesen Code nicht an Dritte weiter.' : 'Do not share this code with third parties.',
|
||||||
mailimprint
|
mailimprint,
|
||||||
|
deviceName,
|
||||||
|
deviceNameIntro: locale === 'de' ? 'Die Anmeldung wurde am Gerät' : 'The login was attempted at the device',
|
||||||
|
deviceNameOutro: locale === 'de' ? 'versucht.' : '.'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const manipulationMailSender = createMailTemplateSender('manipulation')
|
||||||
|
|
||||||
export const sendManipulationWarningMail = async ({ receiver, deviceName }: {
|
export const sendManipulationWarningMail = async ({ receiver, deviceName }: {
|
||||||
receiver: string
|
receiver: string
|
||||||
deviceName: string
|
deviceName: string
|
||||||
}) => {
|
}) => {
|
||||||
await email.send({
|
await manipulationMailSender.sendMail({
|
||||||
template: join(__dirname, '../../other/mail/manipulation'),
|
receiver,
|
||||||
message: {
|
params: {
|
||||||
to: receiver
|
|
||||||
},
|
|
||||||
locals: {
|
|
||||||
subject: 'TimeLimit@' + deviceName + ' - Manipulation',
|
subject: 'TimeLimit@' + deviceName + ' - Manipulation',
|
||||||
deviceName,
|
deviceName,
|
||||||
mailimprint
|
mailimprint
|
||||||
@@ -69,16 +122,15 @@ export const sendManipulationWarningMail = async ({ receiver, deviceName }: {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const uninstallMailSender = createMailTemplateSender('uninstall')
|
||||||
|
|
||||||
export const sendUninstallWarningMail = async ({ receiver, deviceName }: {
|
export const sendUninstallWarningMail = async ({ receiver, deviceName }: {
|
||||||
receiver: string
|
receiver: string
|
||||||
deviceName: string
|
deviceName: string
|
||||||
}) => {
|
}) => {
|
||||||
await email.send({
|
await uninstallMailSender.sendMail({
|
||||||
template: join(__dirname, '../../other/mail/uninstall'),
|
receiver,
|
||||||
message: {
|
params: {
|
||||||
to: receiver
|
|
||||||
},
|
|
||||||
locals: {
|
|
||||||
subject: 'TimeLimit removed from ' + deviceName,
|
subject: 'TimeLimit removed from ' + deviceName,
|
||||||
deviceName,
|
deviceName,
|
||||||
mailimprint
|
mailimprint
|
||||||
@@ -86,20 +138,66 @@ export const sendUninstallWarningMail = async ({ receiver, deviceName }: {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const taskDoneSender = createMailTemplateSender('taskdone')
|
||||||
|
|
||||||
export const sendTaskDoneMail = async ({ receiver, child, task }: {
|
export const sendTaskDoneMail = async ({ receiver, child, task }: {
|
||||||
receiver: string
|
receiver: string
|
||||||
child: string
|
child: string
|
||||||
task: string
|
task: string
|
||||||
}) => {
|
}) => {
|
||||||
await email.send({
|
await taskDoneSender.sendMail({
|
||||||
template: join(__dirname, '../../other/mail/taskdone'),
|
receiver,
|
||||||
message: {
|
params: { child, task, mailimprint }
|
||||||
to: receiver
|
|
||||||
},
|
|
||||||
locals: { child, task, mailimprint }
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const deviceLinkedSender = createMailTemplateSender('device-linked-by-mail')
|
||||||
|
|
||||||
|
export const sendDeviceLinkedMail = async ({ receiver, deviceName, locale }: {
|
||||||
|
receiver: string
|
||||||
|
deviceName: string
|
||||||
|
locale: string
|
||||||
|
}) => {
|
||||||
|
await deviceLinkedSender.sendMail({
|
||||||
|
receiver,
|
||||||
|
params: {
|
||||||
|
subject: locale === 'de' ? 'Gerät hinzugefügt' : 'Device added',
|
||||||
|
preText: locale === 'de' ? 'Soeben wurde das Gerät' : 'The device',
|
||||||
|
deviceName,
|
||||||
|
postText: locale === 'de' ? 'über Ihre E-Mail-Adresse hinzugefügt.' : 'was added using your mail address.',
|
||||||
|
securityText: getMailSecurityText(locale),
|
||||||
|
mailimprint
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const passwordRecoveryUsedMailSender = createMailTemplateSender('password-recovery-used')
|
||||||
|
|
||||||
|
export const sendPasswordRecoveryUsedMail = async ({ receiver, locale }: {
|
||||||
|
receiver: string
|
||||||
|
locale: string
|
||||||
|
}) => {
|
||||||
|
await passwordRecoveryUsedMailSender.sendMail({
|
||||||
|
receiver,
|
||||||
|
params: {
|
||||||
|
subject: locale === 'de' ? 'Passwort-Vergessen-Funktion verwendet' : 'Password reset',
|
||||||
|
text: locale === 'de' ?
|
||||||
|
'Soeben wurde Ihr TimeLimit-Passwort mit der Passwort-Vergessen-Funktion geändert.' :
|
||||||
|
'Your password was changed using the password reset feature.',
|
||||||
|
securityText: getMailSecurityText(locale),
|
||||||
|
mailimprint
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMailSecurityText (locale: string) {
|
||||||
|
if (locale === 'de') {
|
||||||
|
return 'Achten Sie darauf, dass Ihr Kind/Ihre Kinder keinen Zugang zu der E-Mail-Adresse hat/haben, die Sie bei TimeLimit angegeben haben.'
|
||||||
|
} else {
|
||||||
|
return 'Make sure that your child/children can not access the mail addresss that you use for TimeLimit.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function isMailServerBlacklisted (mail: string): boolean {
|
export function isMailServerBlacklisted (mail: string): boolean {
|
||||||
const parts = mail.split('@')
|
const parts = mail.split('@')
|
||||||
const domain = parts[parts.length - 1]
|
const domain = parts[parts.length - 1]
|
||||||
@@ -141,6 +239,7 @@ export function sanitizeMailAddress (input: string): string | null {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
const address = (parsed as any).address
|
const address = (parsed as any).address
|
||||||
|
|
||||||
if (typeof address !== 'string') {
|
if (typeof address !== 'string') {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 Jonas Lochmann
|
* Copyright (C) 2019 - 2022 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -28,7 +28,7 @@ const randomWord = () => wordlist[Math.floor(Math.random() * (wordlist.length -
|
|||||||
|
|
||||||
export const randomWords = (numberOfWords: number) => (
|
export const randomWords = (numberOfWords: number) => (
|
||||||
range(numberOfWords)
|
range(numberOfWords)
|
||||||
.map((item) => randomWord())
|
.map(() => randomWord())
|
||||||
.join(' ')
|
.join(' ')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* 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
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -45,7 +45,7 @@ export const createWebsocketHandler = ({ connectedDevicesManager, database }: {
|
|||||||
socketCounter++
|
socketCounter++
|
||||||
socket.on('disconnect', () => socketCounter--)
|
socket.on('disconnect', () => socketCounter--)
|
||||||
|
|
||||||
socket.on('devicelogin', (deviceAuthToken: any, ack: any) => {
|
socket.on('devicelogin', (deviceAuthToken: unknown, ack: unknown) => {
|
||||||
socket.rooms.forEach((room) => socket.leave(room))
|
socket.rooms.forEach((room) => socket.leave(room))
|
||||||
|
|
||||||
if (typeof deviceAuthToken !== 'string') {
|
if (typeof deviceAuthToken !== 'string') {
|
||||||
@@ -95,7 +95,7 @@ export const createWebsocketHandler = ({ connectedDevicesManager, database }: {
|
|||||||
shutdown()
|
shutdown()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})().catch((ex) => { /* ignore */ })
|
})().catch(() => { /* ignore */ })
|
||||||
|
|
||||||
if (typeof ack === 'function') {
|
if (typeof ack === 'function') {
|
||||||
ack()
|
ack()
|
||||||
|
|||||||
@@ -25,7 +25,11 @@ export function initDeleteDeprecatedPurchasesWorker ({ database, websocket }: {
|
|||||||
websocket: WebsocketApi
|
websocket: WebsocketApi
|
||||||
}) {
|
}) {
|
||||||
function doWorkSafe () {
|
function doWorkSafe () {
|
||||||
deleteDeprecatedPurchases({ database, websocket }).catch((ex) => {
|
console.log('deleting deprecated purchases now')
|
||||||
|
|
||||||
|
deleteDeprecatedPurchases({ database, websocket }).then(() => {
|
||||||
|
console.log('finished deleting deprecated purchases')
|
||||||
|
}).catch((ex) => {
|
||||||
console.warn('error deleting deprecated purchases', ex)
|
console.warn('error deleting deprecated purchases', ex)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -61,9 +65,7 @@ async function deleteDeprecatedPurchases ({ database, websocket }: {
|
|||||||
}, {
|
}, {
|
||||||
where: {
|
where: {
|
||||||
familyId: {
|
familyId: {
|
||||||
[Sequelize.Op.in]: {
|
[Sequelize.Op.in]: affectedFamilyIds
|
||||||
affectedFamilyIds
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
transaction
|
transaction
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 Jonas Lochmann
|
* Copyright (C) 2019 - 2021 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
@@ -22,7 +22,11 @@ export function initDeleteOldFamiliesWorker ({ database }: {
|
|||||||
database: Database
|
database: Database
|
||||||
}) {
|
}) {
|
||||||
function doWorkSafe () {
|
function doWorkSafe () {
|
||||||
deleteOldFamilies(database).catch((ex) => {
|
console.log('deleting old families now')
|
||||||
|
|
||||||
|
deleteOldFamilies(database).then(() => {
|
||||||
|
console.log('finished deleting old families')
|
||||||
|
}).catch((ex) => {
|
||||||
console.warn('error deleting old families', ex)
|
console.warn('error deleting old families', ex)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user