From: Chocobozzz Date: Mon, 1 Oct 2018 13:18:07 +0000 (+0200) Subject: Check video channel name is unique on our instance X-Git-Tag: v1.0.0-rc.1~25 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=601527d7953a83d6ad08dbb2ed8ac02851beaf1e;p=oweals%2Fpeertube.git Check video channel name is unique on our instance --- diff --git a/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts b/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts index 79ac07c93..81608d837 100644 --- a/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts +++ b/client/src/app/+my-account/my-account-video-channels/my-account-video-channel-create.component.ts @@ -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 + } ) } diff --git a/server/controllers/api/users/index.ts b/server/controllers/api/users/index.ts index 8b8ebcd23..0b0081520 100644 --- a/server/controllers/api/users/index.ts +++ b/server/controllers/api/users/index.ts @@ -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' diff --git a/server/controllers/api/video-channel.ts b/server/controllers/api/video-channel.ts index 4ca5ba9bc..1fa842d9c 100644 --- a/server/controllers/api/video-channel.ts +++ b/server/controllers/api/video-channel.ts @@ -46,7 +46,7 @@ videoChannelRouter.get('/', videoChannelRouter.post('/', authenticate, - videoChannelsAddValidator, + asyncMiddleware(videoChannelsAddValidator), asyncRetryTransactionMiddleware(addVideoChannel) ) diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts index d37a695a7..45dd4443d 100644 --- a/server/lib/activitypub/actor.ts +++ b/server/lib/activitypub/actor.ts @@ -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 diff --git a/server/middlewares/activitypub.ts b/server/middlewares/activitypub.ts index 12d5c22c5..d7f59be8c 100644 --- a/server/middlewares/activitypub.ts +++ b/server/middlewares/activitypub.ts @@ -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) } diff --git a/server/middlewares/validators/video-channels.ts b/server/middlewares/validators/video-channels.ts index 79587b028..56a347b39 100644 --- a/server/middlewares/validators/video-channels.ts +++ b/server/middlewares/validators/video-channels.ts @@ -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() } ] diff --git a/server/tests/api/check-params/video-channels.ts b/server/tests/api/check-params/video-channels.ts index bcf4b7473..3a7942945 100644 --- a/server/tests/api/check-params/video-channels.ts +++ b/server/tests/api/check-params/video-channels.ts @@ -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 () {