mirror of https://github.com/Chocobozzz/PeerTube
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 testspull/5762/head
parent
9258e9a4a3
commit
b302c80dc0
|
@ -246,6 +246,17 @@
|
||||||
|
|
||||||
<div *ngIf="formErrors.user.videoQuotaDaily" class="form-error">{{ formErrors.user.videoQuotaDaily }}</div>
|
<div *ngIf="formErrors.user.videoQuotaDaily" class="form-error">{{ formErrors.user.videoQuotaDaily }}</div>
|
||||||
</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>
|
</ng-container>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -165,6 +165,11 @@ export class EditCustomConfigComponent extends FormReactive implements OnInit {
|
||||||
enabled: null
|
enabled: null
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
|
history: {
|
||||||
|
videos: {
|
||||||
|
enabled: null
|
||||||
|
}
|
||||||
|
},
|
||||||
videoQuota: USER_VIDEO_QUOTA_VALIDATOR,
|
videoQuota: USER_VIDEO_QUOTA_VALIDATOR,
|
||||||
videoQuotaDaily: USER_VIDEO_QUOTA_DAILY_VALIDATOR
|
videoQuotaDaily: USER_VIDEO_QUOTA_DAILY_VALIDATOR
|
||||||
},
|
},
|
||||||
|
|
|
@ -408,6 +408,10 @@ signup:
|
||||||
blacklist: []
|
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)
|
# Default value of maximum video bytes the user can upload (does not take into account transcoded files)
|
||||||
# Byte format is supported ("1GB" etc)
|
# Byte format is supported ("1GB" etc)
|
||||||
# -1 == unlimited
|
# -1 == unlimited
|
||||||
|
|
|
@ -417,7 +417,11 @@ signup:
|
||||||
whitelist: []
|
whitelist: []
|
||||||
blacklist: []
|
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)
|
# Default value of maximum video bytes the user can upload (does not take into account transcoded files)
|
||||||
# Byte format is supported ("1GB" etc)
|
# Byte format is supported ("1GB" etc)
|
||||||
# -1 == unlimited
|
# -1 == unlimited
|
||||||
|
|
|
@ -204,6 +204,11 @@ function customConfig (): CustomConfig {
|
||||||
enabled: CONFIG.CONTACT_FORM.ENABLED
|
enabled: CONFIG.CONTACT_FORM.ENABLED
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
|
history: {
|
||||||
|
videos: {
|
||||||
|
enabled: CONFIG.USER.HISTORY.VIDEOS.ENABLED
|
||||||
|
}
|
||||||
|
},
|
||||||
videoQuota: CONFIG.USER.VIDEO_QUOTA,
|
videoQuota: CONFIG.USER.VIDEO_QUOTA,
|
||||||
videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
|
videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
|
||||||
},
|
},
|
||||||
|
|
|
@ -24,7 +24,7 @@ function checkMissedConfig () {
|
||||||
'open_telemetry.metrics.enabled', 'open_telemetry.metrics.prometheus_exporter.hostname',
|
'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.prometheus_exporter.port', 'open_telemetry.tracing.enabled', 'open_telemetry.tracing.jaeger_exporter.endpoint',
|
||||||
'open_telemetry.metrics.http_request_duration.enabled',
|
'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',
|
'video_channels.max_per_user',
|
||||||
'csp.enabled', 'csp.report_only', 'csp.report_uri',
|
'csp.enabled', 'csp.report_only', 'csp.report_uri',
|
||||||
'security.frameguard.enabled', 'security.powered_by_header.enabled',
|
'security.frameguard.enabled', 'security.powered_by_header.enabled',
|
||||||
|
|
|
@ -324,6 +324,11 @@ const CONFIG = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
USER: {
|
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 () { return parseBytes(config.get<number>('user.video_quota')) },
|
||||||
get VIDEO_QUOTA_DAILY () { return parseBytes(config.get<number>('user.video_quota_daily')) }
|
get VIDEO_QUOTA_DAILY () { return parseBytes(config.get<number>('user.video_quota_daily')) }
|
||||||
},
|
},
|
||||||
|
|
|
@ -56,6 +56,8 @@ function buildUser (options: {
|
||||||
|
|
||||||
nsfwPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
|
nsfwPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
|
||||||
p2pEnabled: CONFIG.DEFAULTS.P2P.WEBAPP.ENABLED,
|
p2pEnabled: CONFIG.DEFAULTS.P2P.WEBAPP.ENABLED,
|
||||||
|
videosHistoryEnabled: CONFIG.USER.HISTORY.VIDEOS.ENABLED,
|
||||||
|
|
||||||
autoPlayVideo: true,
|
autoPlayVideo: true,
|
||||||
|
|
||||||
role,
|
role,
|
||||||
|
|
|
@ -35,6 +35,7 @@ const customConfigUpdateValidator = [
|
||||||
body('admin.email').isEmail(),
|
body('admin.email').isEmail(),
|
||||||
body('contactForm.enabled').isBoolean(),
|
body('contactForm.enabled').isBoolean(),
|
||||||
|
|
||||||
|
body('user.history.videos.enabled').isBoolean(),
|
||||||
body('user.videoQuota').custom(isUserVideoQuotaValid),
|
body('user.videoQuota').custom(isUserVideoQuotaValid),
|
||||||
body('user.videoQuotaDaily').custom(isUserVideoQuotaDailyValid),
|
body('user.videoQuotaDaily').custom(isUserVideoQuotaDailyValid),
|
||||||
|
|
||||||
|
|
|
@ -65,8 +65,11 @@ const usersAddValidator = [
|
||||||
.custom(isVideoChannelUsernameValid),
|
.custom(isVideoChannelUsernameValid),
|
||||||
|
|
||||||
body('videoQuota')
|
body('videoQuota')
|
||||||
|
.optional()
|
||||||
.custom(isUserVideoQuotaValid),
|
.custom(isUserVideoQuotaValid),
|
||||||
|
|
||||||
body('videoQuotaDaily')
|
body('videoQuotaDaily')
|
||||||
|
.optional()
|
||||||
.custom(isUserVideoQuotaDailyValid),
|
.custom(isUserVideoQuotaDailyValid),
|
||||||
|
|
||||||
body('role')
|
body('role')
|
||||||
|
|
|
@ -90,6 +90,11 @@ describe('Test config API validators', function () {
|
||||||
enabled: false
|
enabled: false
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
|
history: {
|
||||||
|
videos: {
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
},
|
||||||
videoQuota: 5242881,
|
videoQuota: 5242881,
|
||||||
videoQuotaDaily: 318742
|
videoQuotaDaily: 318742
|
||||||
},
|
},
|
||||||
|
|
|
@ -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 () {
|
it('Should fail with an invalid videoQuota', async function () {
|
||||||
const fields = { ...baseCorrectParams, videoQuota: -5 }
|
const fields = { ...baseCorrectParams, videoQuota: -5 }
|
||||||
|
|
||||||
|
|
|
@ -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 () {
|
after(async function () {
|
||||||
await cleanupTests([ server ])
|
await cleanupTests([ server ])
|
||||||
})
|
})
|
||||||
|
|
|
@ -56,6 +56,7 @@ function checkInitialConfig (server: PeerTubeServer, data: CustomConfig) {
|
||||||
expect(data.admin.email).to.equal('admin' + server.internalServerNumber + '@example.com')
|
expect(data.admin.email).to.equal('admin' + server.internalServerNumber + '@example.com')
|
||||||
expect(data.contactForm.enabled).to.be.true
|
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.videoQuota).to.equal(5242880)
|
||||||
expect(data.user.videoQuotaDaily).to.equal(-1)
|
expect(data.user.videoQuotaDaily).to.equal(-1)
|
||||||
|
|
||||||
|
@ -164,6 +165,7 @@ function checkUpdatedConfig (data: CustomConfig) {
|
||||||
|
|
||||||
expect(data.contactForm.enabled).to.be.false
|
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.videoQuota).to.equal(5242881)
|
||||||
expect(data.user.videoQuotaDaily).to.equal(318742)
|
expect(data.user.videoQuotaDaily).to.equal(318742)
|
||||||
|
|
||||||
|
@ -298,6 +300,11 @@ const newCustomConfig: CustomConfig = {
|
||||||
enabled: false
|
enabled: false
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
|
history: {
|
||||||
|
videos: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
},
|
||||||
videoQuota: 5242881,
|
videoQuota: 5242881,
|
||||||
videoQuotaDaily: 318742
|
videoQuotaDaily: 318742
|
||||||
},
|
},
|
||||||
|
|
|
@ -97,6 +97,11 @@ export interface CustomConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
user: {
|
user: {
|
||||||
|
history: {
|
||||||
|
videos: {
|
||||||
|
enabled: boolean
|
||||||
|
}
|
||||||
|
}
|
||||||
videoQuota: number
|
videoQuota: number
|
||||||
videoQuotaDaily: number
|
videoQuotaDaily: number
|
||||||
}
|
}
|
||||||
|
@ -229,4 +234,5 @@ export interface CustomConfig {
|
||||||
isDefaultSearch: boolean
|
isDefaultSearch: boolean
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -350,6 +350,11 @@ export class ConfigCommand extends AbstractCommand {
|
||||||
enabled: true
|
enabled: true
|
||||||
},
|
},
|
||||||
user: {
|
user: {
|
||||||
|
history: {
|
||||||
|
videos: {
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
},
|
||||||
videoQuota: 5242881,
|
videoQuota: 5242881,
|
||||||
videoQuotaDaily: 318742
|
videoQuotaDaily: 318742
|
||||||
},
|
},
|
||||||
|
|
|
@ -165,8 +165,8 @@ export class UsersCommand extends AbstractCommand {
|
||||||
username,
|
username,
|
||||||
adminFlags,
|
adminFlags,
|
||||||
password = 'password',
|
password = 'password',
|
||||||
videoQuota = 42000000,
|
videoQuota,
|
||||||
videoQuotaDaily = -1,
|
videoQuotaDaily,
|
||||||
role = UserRole.USER
|
role = UserRole.USER
|
||||||
} = options
|
} = options
|
||||||
|
|
||||||
|
|
|
@ -7894,8 +7894,6 @@ components:
|
||||||
- username
|
- username
|
||||||
- password
|
- password
|
||||||
- email
|
- email
|
||||||
- videoQuota
|
|
||||||
- videoQuotaDaily
|
|
||||||
- role
|
- role
|
||||||
UpdateUser:
|
UpdateUser:
|
||||||
properties:
|
properties:
|
||||||
|
|
Loading…
Reference in New Issue