Check video channel name is unique on our instance

pull/1162/head
Chocobozzz 2018-10-01 15:18:07 +02:00
parent 7361c401b1
commit 601527d795
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
7 changed files with 31 additions and 6 deletions

View File

@ -63,7 +63,14 @@ export class MyAccountVideoChannelCreateComponent extends MyAccountVideoChannelE
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
}
)
}

View File

@ -34,7 +34,6 @@ import {
usersVerifyEmailValidator
} from '../../../middlewares/validators'
import { UserModel } from '../../../models/account/user'
import { OAuthTokenModel } from '../../../models/oauth/oauth-token'
import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '../../../helpers/audit-logger'
import { meRouter } from './me'
import { deleteUserToken } from '../../../lib/oauth-model'

View File

@ -46,7 +46,7 @@ videoChannelRouter.get('/',
videoChannelRouter.post('/',
authenticate,
videoChannelsAddValidator,
asyncMiddleware(videoChannelsAddValidator),
asyncRetryTransactionMiddleware(addVideoChannel)
)

View File

@ -56,7 +56,7 @@ async function getOrCreateActorAndServerAndModel (
// We don't have this actor in our database, fetch it on remote
if (!actor) {
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
// In PeerTube a video channel is owned by an account

View File

@ -18,7 +18,7 @@ async function checkSignature (req: Request, res: Response, next: NextFunction)
try {
actor = await getOrCreateActorAndServerAndModel(creator)
} 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)
}

View File

@ -14,6 +14,7 @@ import { UserModel } from '../../models/account/user'
import { VideoChannelModel } from '../../models/video/video-channel'
import { areValidationErrors } from './utils'
import { isActorPreferredUsernameValid } from '../../helpers/custom-validators/activitypub/actor'
import { ActorModel } from '../../models/activitypub/actor'
const listVideoAccountChannelsValidator = [
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('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 })
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()
}
]

View File

@ -136,6 +136,16 @@ describe('Test video channels API validator', function () {
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 () {