feature/ability to disable video history by default (#5728)

* draft: ability to disable video history by default

* Update configuration and add tests

* Updated code based on review comments

* Add tests on registration and video quota

* Remove required video quotas in query

* Fix tests
pull/5762/head
Wicklow 2023-04-07 08:09:54 +00:00 committed by GitHub
parent 9258e9a4a3
commit b302c80dc0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 145 additions and 18 deletions

View File

@ -246,6 +246,17 @@
<div *ngIf="formErrors.user.videoQuotaDaily" class="form-error">{{ formErrors.user.videoQuotaDaily }}</div>
</div>
<div class="form-group">
<ng-container formGroupName="history">
<ng-container formGroupName="videos">
<my-peertube-checkbox
inputName="videosHistoryEnabled" formControlName="enabled"
i18n-labelText labelText="Automatically enable video history for new users"
>
</my-peertube-checkbox>
</ng-container>
</ng-container>
</div>
</ng-container>
</div>

View File

@ -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
},

View File

@ -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

View File

@ -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

View File

@ -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
},

View File

@ -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',

View File

@ -324,6 +324,11 @@ const CONFIG = {
}
},
USER: {
HISTORY: {
VIDEOS: {
get ENABLED () { return config.get<boolean>('user.history.videos.enabled') }
}
},
get VIDEO_QUOTA () { return parseBytes(config.get<number>('user.video_quota')) },
get VIDEO_QUOTA_DAILY () { return parseBytes(config.get<number>('user.video_quota_daily')) }
},

View File

@ -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,

View File

@ -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),

View File

@ -65,8 +65,11 @@ const usersAddValidator = [
.custom(isVideoChannelUsernameValid),
body('videoQuota')
.optional()
.custom(isUserVideoQuotaValid),
body('videoQuotaDaily')
.optional()
.custom(isUserVideoQuotaDailyValid),
body('role')

View File

@ -90,6 +90,11 @@ describe('Test config API validators', function () {
enabled: false
},
user: {
history: {
videos: {
enabled: true
}
},
videoQuota: 5242881,
videoQuotaDaily: 318742
},

View File

@ -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 }

View File

@ -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 ])
})

View File

@ -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
},

View File

@ -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
}
}
}

View File

@ -350,6 +350,11 @@ export class ConfigCommand extends AbstractCommand {
enabled: true
},
user: {
history: {
videos: {
enabled: true
}
},
videoQuota: 5242881,
videoQuotaDaily: 318742
},

View File

@ -165,8 +165,8 @@ export class UsersCommand extends AbstractCommand {
username,
adminFlags,
password = 'password',
videoQuota = 42000000,
videoQuotaDaily = -1,
videoQuota,
videoQuotaDaily,
role = UserRole.USER
} = options

View File

@ -7894,8 +7894,6 @@ components:
- username
- password
- email
- videoQuota
- videoQuotaDaily
- role
UpdateUser:
properties: