diff --git a/client/src/app/+admin/config/edit-custom-config/edit-basic-configuration.component.html b/client/src/app/+admin/config/edit-custom-config/edit-basic-configuration.component.html index 8399b5d56..9fc332308 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-basic-configuration.component.html +++ b/client/src/app/+admin/config/edit-custom-config/edit-basic-configuration.component.html @@ -246,6 +246,17 @@
{{ formErrors.user.videoQuotaDaily }}
+
+ + + + + + +
diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts index 2afe80a03..0526ed8f1 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts +++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts @@ -165,6 +165,11 @@ export class EditCustomConfigComponent extends FormReactive implements OnInit { enabled: null }, user: { + history: { + videos: { + enabled: null + } + }, videoQuota: USER_VIDEO_QUOTA_VALIDATOR, videoQuotaDaily: USER_VIDEO_QUOTA_DAILY_VALIDATOR }, diff --git a/config/default.yaml b/config/default.yaml index db014cc87..dfa43a0aa 100644 --- a/config/default.yaml +++ b/config/default.yaml @@ -408,6 +408,10 @@ signup: blacklist: [] user: + history: + videos: + # Enable or disable video history by default for new users. + enabled: true # Default value of maximum video bytes the user can upload (does not take into account transcoded files) # Byte format is supported ("1GB" etc) # -1 == unlimited diff --git a/config/production.yaml.example b/config/production.yaml.example index 9cb8add1f..744a14e91 100644 --- a/config/production.yaml.example +++ b/config/production.yaml.example @@ -417,7 +417,11 @@ signup: whitelist: [] blacklist: [] -user: +user: + history: + videos: + # Enable or disable video history by default for new users. + enabled: true # Default value of maximum video bytes the user can upload (does not take into account transcoded files) # Byte format is supported ("1GB" etc) # -1 == unlimited diff --git a/server/controllers/api/config.ts b/server/controllers/api/config.ts index 86434f382..60d168d12 100644 --- a/server/controllers/api/config.ts +++ b/server/controllers/api/config.ts @@ -204,6 +204,11 @@ function customConfig (): CustomConfig { enabled: CONFIG.CONTACT_FORM.ENABLED }, user: { + history: { + videos: { + enabled: CONFIG.USER.HISTORY.VIDEOS.ENABLED + } + }, videoQuota: CONFIG.USER.VIDEO_QUOTA, videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY }, diff --git a/server/initializers/checker-before-init.ts b/server/initializers/checker-before-init.ts index 1351749a6..49010c059 100644 --- a/server/initializers/checker-before-init.ts +++ b/server/initializers/checker-before-init.ts @@ -24,7 +24,7 @@ function checkMissedConfig () { 'open_telemetry.metrics.enabled', 'open_telemetry.metrics.prometheus_exporter.hostname', 'open_telemetry.metrics.prometheus_exporter.port', 'open_telemetry.tracing.enabled', 'open_telemetry.tracing.jaeger_exporter.endpoint', 'open_telemetry.metrics.http_request_duration.enabled', - 'user.video_quota', 'user.video_quota_daily', + 'user.history.videos.enabled', 'user.video_quota', 'user.video_quota_daily', 'video_channels.max_per_user', 'csp.enabled', 'csp.report_only', 'csp.report_uri', 'security.frameguard.enabled', 'security.powered_by_header.enabled', diff --git a/server/initializers/config.ts b/server/initializers/config.ts index eb9d0079c..e2442213c 100644 --- a/server/initializers/config.ts +++ b/server/initializers/config.ts @@ -324,6 +324,11 @@ const CONFIG = { } }, USER: { + HISTORY: { + VIDEOS: { + get ENABLED () { return config.get('user.history.videos.enabled') } + } + }, get VIDEO_QUOTA () { return parseBytes(config.get('user.video_quota')) }, get VIDEO_QUOTA_DAILY () { return parseBytes(config.get('user.video_quota_daily')) } }, diff --git a/server/lib/user.ts b/server/lib/user.ts index ffb57944a..56995cca3 100644 --- a/server/lib/user.ts +++ b/server/lib/user.ts @@ -56,6 +56,8 @@ function buildUser (options: { nsfwPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY, p2pEnabled: CONFIG.DEFAULTS.P2P.WEBAPP.ENABLED, + videosHistoryEnabled: CONFIG.USER.HISTORY.VIDEOS.ENABLED, + autoPlayVideo: true, role, diff --git a/server/middlewares/validators/config.ts b/server/middlewares/validators/config.ts index c2dbfadb7..4a9d1cb54 100644 --- a/server/middlewares/validators/config.ts +++ b/server/middlewares/validators/config.ts @@ -35,6 +35,7 @@ const customConfigUpdateValidator = [ body('admin.email').isEmail(), body('contactForm.enabled').isBoolean(), + body('user.history.videos.enabled').isBoolean(), body('user.videoQuota').custom(isUserVideoQuotaValid), body('user.videoQuotaDaily').custom(isUserVideoQuotaDailyValid), diff --git a/server/middlewares/validators/users.ts b/server/middlewares/validators/users.ts index f7033f44a..7ebea048d 100644 --- a/server/middlewares/validators/users.ts +++ b/server/middlewares/validators/users.ts @@ -65,8 +65,11 @@ const usersAddValidator = [ .custom(isVideoChannelUsernameValid), body('videoQuota') + .optional() .custom(isUserVideoQuotaValid), + body('videoQuotaDaily') + .optional() .custom(isUserVideoQuotaDailyValid), body('role') diff --git a/server/tests/api/check-params/config.ts b/server/tests/api/check-params/config.ts index 93a3f3eb9..f49a4b868 100644 --- a/server/tests/api/check-params/config.ts +++ b/server/tests/api/check-params/config.ts @@ -90,6 +90,11 @@ describe('Test config API validators', function () { enabled: false }, user: { + history: { + videos: { + enabled: true + } + }, videoQuota: 5242881, videoQuotaDaily: 318742 }, diff --git a/server/tests/api/check-params/users-admin.ts b/server/tests/api/check-params/users-admin.ts index be2496bb4..819da0bb2 100644 --- a/server/tests/api/check-params/users-admin.ts +++ b/server/tests/api/check-params/users-admin.ts @@ -216,18 +216,6 @@ describe('Test users admin API validators', function () { }) }) - it('Should fail without a videoQuota', async function () { - const fields = omit(baseCorrectParams, [ 'videoQuota' ]) - - await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) - }) - - it('Should fail without a videoQuotaDaily', async function () { - const fields = omit(baseCorrectParams, [ 'videoQuotaDaily' ]) - - await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) - }) - it('Should fail with an invalid videoQuota', async function () { const fields = { ...baseCorrectParams, videoQuota: -5 } diff --git a/server/tests/api/server/config-defaults.ts b/server/tests/api/server/config-defaults.ts index d3b3a2447..041032f2b 100644 --- a/server/tests/api/server/config-defaults.ts +++ b/server/tests/api/server/config-defaults.ts @@ -204,6 +204,84 @@ describe('Test config defaults', function () { }) }) + describe('Default user attributes', function () { + it('Should create a user and register a user with the default config', async function () { + await server.config.updateCustomSubConfig({ + newConfig: { + user: { + history: { + videos: { + enabled: true + } + }, + videoQuota : -1, + videoQuotaDaily: -1 + }, + signup: { + enabled: true, + requiresApproval: false + } + } + }) + + const config = await server.config.getConfig() + + expect(config.user.videoQuota).to.equal(-1) + expect(config.user.videoQuotaDaily).to.equal(-1) + + const user1Token = await server.users.generateUserAndToken('user1') + const user1 = await server.users.getMyInfo({ token: user1Token }) + + const user = { displayName: 'super user 2', username: 'user2', password: 'super password' } + const channel = { name: 'my_user_2_channel', displayName: 'my channel' } + await server.registrations.register({ ...user, channel }) + const user2Token = await server.login.getAccessToken(user) + const user2 = await server.users.getMyInfo({ token: user2Token }) + + for (const user of [ user1, user2 ]) { + expect(user.videosHistoryEnabled).to.be.true + expect(user.videoQuota).to.equal(-1) + expect(user.videoQuotaDaily).to.equal(-1) + } + }) + + it('Should update config and create a user and register a user with the new default config', async function () { + await server.config.updateCustomSubConfig({ + newConfig: { + user: { + history: { + videos: { + enabled: false + } + }, + videoQuota : 5242881, + videoQuotaDaily: 318742 + }, + signup: { + enabled: true, + requiresApproval: false + } + } + }) + + const user3Token = await server.users.generateUserAndToken('user3') + const user3 = await server.users.getMyInfo({ token: user3Token }) + + const user = { displayName: 'super user 4', username: 'user4', password: 'super password' } + const channel = { name: 'my_user_4_channel', displayName: 'my channel' } + await server.registrations.register({ ...user, channel }) + const user4Token = await server.login.getAccessToken(user) + const user4 = await server.users.getMyInfo({ token: user4Token }) + + for (const user of [ user3, user4 ]) { + expect(user.videosHistoryEnabled).to.be.false + expect(user.videoQuota).to.equal(5242881) + expect(user.videoQuotaDaily).to.equal(318742) + } + }) + + }) + after(async function () { await cleanupTests([ server ]) }) diff --git a/server/tests/api/server/config.ts b/server/tests/api/server/config.ts index de7c2f6e2..3683c4ae1 100644 --- a/server/tests/api/server/config.ts +++ b/server/tests/api/server/config.ts @@ -56,6 +56,7 @@ function checkInitialConfig (server: PeerTubeServer, data: CustomConfig) { expect(data.admin.email).to.equal('admin' + server.internalServerNumber + '@example.com') expect(data.contactForm.enabled).to.be.true + expect(data.user.history.videos.enabled).to.be.true expect(data.user.videoQuota).to.equal(5242880) expect(data.user.videoQuotaDaily).to.equal(-1) @@ -164,6 +165,7 @@ function checkUpdatedConfig (data: CustomConfig) { expect(data.contactForm.enabled).to.be.false + expect(data.user.history.videos.enabled).to.be.false expect(data.user.videoQuota).to.equal(5242881) expect(data.user.videoQuotaDaily).to.equal(318742) @@ -298,6 +300,11 @@ const newCustomConfig: CustomConfig = { enabled: false }, user: { + history: { + videos: { + enabled: false + } + }, videoQuota: 5242881, videoQuotaDaily: 318742 }, diff --git a/shared/models/server/custom-config.model.ts b/shared/models/server/custom-config.model.ts index 846bf6159..6ffe3a676 100644 --- a/shared/models/server/custom-config.model.ts +++ b/shared/models/server/custom-config.model.ts @@ -97,6 +97,11 @@ export interface CustomConfig { } user: { + history: { + videos: { + enabled: boolean + } + } videoQuota: number videoQuotaDaily: number } @@ -229,4 +234,5 @@ export interface CustomConfig { isDefaultSearch: boolean } } + } diff --git a/shared/server-commands/server/config-command.ts b/shared/server-commands/server/config-command.ts index eb6bb95a5..303fcab88 100644 --- a/shared/server-commands/server/config-command.ts +++ b/shared/server-commands/server/config-command.ts @@ -350,6 +350,11 @@ export class ConfigCommand extends AbstractCommand { enabled: true }, user: { + history: { + videos: { + enabled: true + } + }, videoQuota: 5242881, videoQuotaDaily: 318742 }, diff --git a/shared/server-commands/users/users-command.ts b/shared/server-commands/users/users-command.ts index 8a42fafc8..5b39d3488 100644 --- a/shared/server-commands/users/users-command.ts +++ b/shared/server-commands/users/users-command.ts @@ -165,8 +165,8 @@ export class UsersCommand extends AbstractCommand { username, adminFlags, password = 'password', - videoQuota = 42000000, - videoQuotaDaily = -1, + videoQuota, + videoQuotaDaily, role = UserRole.USER } = options diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml index 959a70438..046eec544 100644 --- a/support/doc/api/openapi.yaml +++ b/support/doc/api/openapi.yaml @@ -7894,8 +7894,6 @@ components: - username - password - email - - videoQuota - - videoQuotaDaily - role UpdateUser: properties: