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: