mirror of https://github.com/Chocobozzz/PeerTube
Check video channel name is unique on our instance
parent
7361c401b1
commit
601527d795
|
@ -63,7 +63,14 @@ export class MyAccountVideoChannelCreateComponent extends MyAccountVideoChannelE
|
||||||
this.router.navigate([ '/my-account', 'video-channels' ])
|
this.router.navigate([ '/my-account', 'video-channels' ])
|
||||||
},
|
},
|
||||||
|
|
||||||
err => this.error = err.message
|
err => {
|
||||||
|
if (err.status === 409) {
|
||||||
|
this.error = this.i18n('This name already exists on this instance.')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.error = err.message
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@ import {
|
||||||
usersVerifyEmailValidator
|
usersVerifyEmailValidator
|
||||||
} from '../../../middlewares/validators'
|
} from '../../../middlewares/validators'
|
||||||
import { UserModel } from '../../../models/account/user'
|
import { UserModel } from '../../../models/account/user'
|
||||||
import { OAuthTokenModel } from '../../../models/oauth/oauth-token'
|
|
||||||
import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '../../../helpers/audit-logger'
|
import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '../../../helpers/audit-logger'
|
||||||
import { meRouter } from './me'
|
import { meRouter } from './me'
|
||||||
import { deleteUserToken } from '../../../lib/oauth-model'
|
import { deleteUserToken } from '../../../lib/oauth-model'
|
||||||
|
|
|
@ -46,7 +46,7 @@ videoChannelRouter.get('/',
|
||||||
|
|
||||||
videoChannelRouter.post('/',
|
videoChannelRouter.post('/',
|
||||||
authenticate,
|
authenticate,
|
||||||
videoChannelsAddValidator,
|
asyncMiddleware(videoChannelsAddValidator),
|
||||||
asyncRetryTransactionMiddleware(addVideoChannel)
|
asyncRetryTransactionMiddleware(addVideoChannel)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ async function getOrCreateActorAndServerAndModel (
|
||||||
// We don't have this actor in our database, fetch it on remote
|
// We don't have this actor in our database, fetch it on remote
|
||||||
if (!actor) {
|
if (!actor) {
|
||||||
const { result } = await fetchRemoteActor(actorUrl)
|
const { result } = await fetchRemoteActor(actorUrl)
|
||||||
if (result === undefined) throw new Error('Cannot fetch remote actor.')
|
if (result === undefined) throw new Error('Cannot fetch remote actor ' + actorUrl)
|
||||||
|
|
||||||
// Create the attributed to actor
|
// Create the attributed to actor
|
||||||
// In PeerTube a video channel is owned by an account
|
// In PeerTube a video channel is owned by an account
|
||||||
|
|
|
@ -18,7 +18,7 @@ async function checkSignature (req: Request, res: Response, next: NextFunction)
|
||||||
try {
|
try {
|
||||||
actor = await getOrCreateActorAndServerAndModel(creator)
|
actor = await getOrCreateActorAndServerAndModel(creator)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('Cannot create remote actor and check signature.', { err })
|
logger.warn('Cannot create remote actor %s and check signature.', creator, { err })
|
||||||
return res.sendStatus(403)
|
return res.sendStatus(403)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import { UserModel } from '../../models/account/user'
|
||||||
import { VideoChannelModel } from '../../models/video/video-channel'
|
import { VideoChannelModel } from '../../models/video/video-channel'
|
||||||
import { areValidationErrors } from './utils'
|
import { areValidationErrors } from './utils'
|
||||||
import { isActorPreferredUsernameValid } from '../../helpers/custom-validators/activitypub/actor'
|
import { isActorPreferredUsernameValid } from '../../helpers/custom-validators/activitypub/actor'
|
||||||
|
import { ActorModel } from '../../models/activitypub/actor'
|
||||||
|
|
||||||
const listVideoAccountChannelsValidator = [
|
const listVideoAccountChannelsValidator = [
|
||||||
param('accountName').exists().withMessage('Should have a valid account name'),
|
param('accountName').exists().withMessage('Should have a valid account name'),
|
||||||
|
@ -34,11 +35,19 @@ const videoChannelsAddValidator = [
|
||||||
body('description').optional().custom(isVideoChannelDescriptionValid).withMessage('Should have a valid description'),
|
body('description').optional().custom(isVideoChannelDescriptionValid).withMessage('Should have a valid description'),
|
||||||
body('support').optional().custom(isVideoChannelSupportValid).withMessage('Should have a valid support text'),
|
body('support').optional().custom(isVideoChannelSupportValid).withMessage('Should have a valid support text'),
|
||||||
|
|
||||||
(req: express.Request, res: express.Response, next: express.NextFunction) => {
|
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||||||
logger.debug('Checking videoChannelsAdd parameters', { parameters: req.body })
|
logger.debug('Checking videoChannelsAdd parameters', { parameters: req.body })
|
||||||
|
|
||||||
if (areValidationErrors(req, res)) return
|
if (areValidationErrors(req, res)) return
|
||||||
|
|
||||||
|
const actor = await ActorModel.loadLocalByName(req.body.name)
|
||||||
|
if (actor) {
|
||||||
|
res.status(409)
|
||||||
|
.send({ error: 'Another actor (account/channel) with this name on this instance already exists or has already existed.' })
|
||||||
|
.end()
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
return next()
|
return next()
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -136,6 +136,16 @@ describe('Test video channels API validator', function () {
|
||||||
statusCodeExpected: 200
|
statusCodeExpected: 200
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('Should fail when adding a channel with the same username', async function () {
|
||||||
|
await makePostBodyRequest({
|
||||||
|
url: server.url,
|
||||||
|
path: videoChannelPath,
|
||||||
|
token: server.accessToken,
|
||||||
|
fields: baseCorrectParams,
|
||||||
|
statusCodeExpected: 409
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('When updating a video channel', function () {
|
describe('When updating a video channel', function () {
|
||||||
|
|
Loading…
Reference in New Issue