Add option to always unlock the premium version

This commit is contained in:
Jonas Lochmann 2020-08-03 02:00:00 +02:00
parent f8b4fc77a5
commit a73af1338e
No known key found for this signature in database
GPG key ID: 8B8C9AEE10FA5B36
8 changed files with 24 additions and 11 deletions

View file

@ -20,12 +20,13 @@ On a invalid request body: HTTP status code 400 Bad Request
If the mail auth token is invalid/ expired: HTTP status code 401 Unauthorized If the mail auth token is invalid/ expired: HTTP status code 401 Unauthorized
On success: a object with the properties ``status`` (string), ``mail`` (string) and On success: a object with the properties ``status`` (string), ``mail`` (string),
``canCreateFamily`` (boolean) ``canCreateFamily`` (boolean) and ``alwaysPro`` (boolean)
- ``status`` is ``with family`` or ``without family`` - ``status`` is ``with family`` or ``without family``
- ``mail`` is the mail address for which the auth token was created - ``mail`` is the mail address for which the auth token was created
- ``canCreateFamily`` is false if the sign up of new families was disabled and otherwise true - ``canCreateFamily`` is false if the sign up of new families was disabled and otherwise true
- ``alwaysPro`` is true if the premium version is always unlocked
## POST /parent/create-family ## POST /parent/create-family

View file

@ -48,7 +48,9 @@
- DISABLE_SIGNUP - DISABLE_SIGNUP
- ``yes`` or ``no`` (default: no) - ``yes`` or ``no`` (default: no)
- disables creating new families if ``yes`` is selected - disables creating new families if ``yes`` is selected
- the default value is ``no`` - ALWAYS_PRO
- ``yes`` or ``no`` (default: ``no``)
- if ``yes``, then the features of the premium version are unlocked for all users
- PING_INTERVAL_SEC - PING_INTERVAL_SEC
- ping interval at the websocket in seconds - ping interval at the websocket in seconds
- the default value is ``25`` - the default value is ``25``

View file

@ -23,6 +23,7 @@ services:
PORT: 8080 PORT: 8080
MAIL_SENDER: me@my.timelimit.server MAIL_SENDER: me@my.timelimit.server
MAIL_TRANSPORT: '{"host": "localhost", "port": 25}' MAIL_TRANSPORT: '{"host": "localhost", "port": 25}'
ALWAYS_PRO: yes
# put additional config variables here # put additional config variables here
ports: ports:
- "8080:8080" - "8080:8080"
@ -68,6 +69,7 @@ services:
PORT: 8080 PORT: 8080
MAIL_SENDER: me@my.timelimit.server MAIL_SENDER: me@my.timelimit.server
MAIL_TRANSPORT: '{"host": "localhost", "port": 25}' MAIL_TRANSPORT: '{"host": "localhost", "port": 25}'
ALWAYS_PRO: yes
# put additional config variables here # put additional config variables here
restart: always restart: always
# you can enable logging during testing by commenting this out, # you can enable logging during testing by commenting this out,

View file

@ -51,7 +51,8 @@ export const createParentRouter = ({ database, websocket }: {database: Database,
res.json({ res.json({
status, status,
mail, mail,
canCreateFamily: !config.disableSignup canCreateFamily: !config.disableSignup,
alwaysPro: config.alwaysPro
}) })
} catch (ex) { } catch (ex) {
next(ex) next(ex)

View file

@ -20,6 +20,7 @@ interface Config {
mailWhitelist: Array<string> mailWhitelist: Array<string>
disableSignup: boolean disableSignup: boolean
pingInterval: number pingInterval: number
alwaysPro: boolean
} }
function parseYesNo (value: string) { function parseYesNo (value: string) {
@ -28,12 +29,13 @@ function parseYesNo (value: string) {
} else if (value === 'no') { } else if (value === 'no') {
return false return false
} else { } else {
throw new Error('invalid value "' + value + '", expected "" or "no"') throw new Error('invalid value "' + value + '", expected "yes" or "no"')
} }
} }
export const config: Config = { export const config: Config = {
mailWhitelist: (process.env.MAIL_WHITELIST || '').split(',').map((item) => item.trim()).filter((item) => item.length > 0), mailWhitelist: (process.env.MAIL_WHITELIST || '').split(',').map((item) => item.trim()).filter((item) => item.length > 0),
disableSignup: parseYesNo(process.env.DISABLE_SIGNUP || 'no'), disableSignup: parseYesNo(process.env.DISABLE_SIGNUP || 'no'),
pingInterval: parseInt(process.env.PING_INTERVAL_SEC || '25', 10) * 1000 pingInterval: parseInt(process.env.PING_INTERVAL_SEC || '25', 10) * 1000,
alwaysPro: process.env.ALWAYS_PRO ? parseYesNo(process.env.ALWAYS_PRO) : false
} }

View file

@ -1,6 +1,6 @@
/* /*
* server component for the TimeLimit App * server component for the TimeLimit App
* Copyright (C) 2019 Jonas Lochmann * Copyright (C) 2019 - 2020 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 { Conflict, Unauthorized } from 'http-errors' import { Conflict, Unauthorized } from 'http-errors'
import * as Sequelize from 'sequelize' import * as Sequelize from 'sequelize'
import { config } from '../../config'
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'
@ -104,7 +105,7 @@ export const setPrimaryDevice = async ({ database, websocket, deviceAuthToken, c
hasFullVersion: familyEntryUnsafe.hasFullVersion hasFullVersion: familyEntryUnsafe.hasFullVersion
} }
if (!familyEntry.hasFullVersion) { if (!(familyEntry.hasFullVersion || config.alwaysPro)) {
return { return {
response: 'requires full version', response: 'requires full version',
sourceDeviceId: deviceEntry.deviceId, sourceDeviceId: deviceEntry.deviceId,

View file

@ -1,6 +1,6 @@
/* /*
* server component for the TimeLimit App * server component for the TimeLimit App
* Copyright (C) 2019 Jonas Lochmann * Copyright (C) 2019 - 2020 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 { memoize, uniq } from 'lodash' import { memoize, uniq } from 'lodash'
import * as Sequelize from 'sequelize' import * as Sequelize from 'sequelize'
import { config } from '../../../config'
import { VisibleConnectedDevicesManager } from '../../../connected-devices' import { VisibleConnectedDevicesManager } from '../../../connected-devices'
import { Database } from '../../../database' import { Database } from '../../../database'
import { generateVersionId } from '../../../util/token' import { generateVersionId } from '../../../util/token'
@ -49,7 +50,7 @@ export class Cache {
connectedDevicesManager: VisibleConnectedDevicesManager connectedDevicesManager: VisibleConnectedDevicesManager
}) { }) {
this.familyId = familyId this.familyId = familyId
this.hasFullVersion = hasFullVersion this.hasFullVersion = hasFullVersion || config.alwaysPro
this.database = database this.database = database
this.transaction = transaction this.transaction = transaction
this.connectedDevicesManager = connectedDevicesManager this.connectedDevicesManager = connectedDevicesManager

View file

@ -17,6 +17,7 @@
import { difference, filter, intersection } from 'lodash' import { difference, filter, intersection } from 'lodash'
import * as Sequelize from 'sequelize' import * as Sequelize from 'sequelize'
import { config } from '../../config'
import { Database } from '../../database' import { Database } from '../../database'
import { getStatusMessage } from '../../function/statusmessage' import { getStatusMessage } from '../../function/statusmessage'
import { ClientDataStatus } from '../../object/clientdatastatus' import { ClientDataStatus } from '../../object/clientdatastatus'
@ -58,7 +59,9 @@ export const generateServerDataStatus = async ({ database, clientStatus, familyI
} }
let result: ServerDataStatus = { let result: ServerDataStatus = {
fullVersion: familyEntry.hasFullVersion ? parseInt(familyEntry.fullVersionUntil, 10) : 0, fullVersion: config.alwaysPro ? 1 : (
familyEntry.hasFullVersion ? parseInt(familyEntry.fullVersionUntil, 10) : 0
),
message: await getStatusMessage({ database, transaction }) || undefined message: await getStatusMessage({ database, transaction }) || undefined
} }