]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Fix pending subscription deletion
authorChocobozzz <me@florianbigard.com>
Wed, 17 May 2023 13:08:40 +0000 (15:08 +0200)
committerChocobozzz <me@florianbigard.com>
Wed, 17 May 2023 13:08:40 +0000 (15:08 +0200)
server/middlewares/validators/user-subscriptions.ts

index d8d3fc28b8fb9e6756ab9bbb76071d414e44b5b4..68d83add528e5c81929b301016d3d403ced3c1eb 100644 (file)
@@ -1,6 +1,7 @@
 import express from 'express'
 import { body, param, query } from 'express-validator'
 import { arrayify } from '@shared/core-utils'
+import { FollowState } from '@shared/models'
 import { HttpStatusCode } from '../../../shared/models/http/http-error-codes'
 import { areValidActorHandles, isValidActorHandle } from '../../helpers/custom-validators/activitypub/actor'
 import { WEBSERVER } from '../../initializers/constants'
@@ -48,26 +49,20 @@ const userSubscriptionGetValidator = [
 
   async (req: express.Request, res: express.Response, next: express.NextFunction) => {
     if (areValidationErrors(req, res)) return
+    if (!await doesSubscriptionExist({ uri: req.params.uri, res, state: 'accepted' })) return
 
-    let [ name, host ] = req.params.uri.split('@')
-    if (host === WEBSERVER.HOST) host = null
+    return next()
+  }
+]
 
-    const user = res.locals.oauth.token.User
-    const subscription = await ActorFollowModel.loadByActorAndTargetNameAndHostForAPI({
-      actorId: user.Account.Actor.id,
-      targetName: name,
-      targetHost: host,
-      state: 'accepted'
-    })
+const userSubscriptionDeleteValidator = [
+  param('uri')
+    .custom(isValidActorHandle),
 
-    if (!subscription?.ActorFollowing.VideoChannel) {
-      return res.fail({
-        status: HttpStatusCode.NOT_FOUND_404,
-        message: `Subscription ${req.params.uri} not found.`
-      })
-    }
+  async (req: express.Request, res: express.Response, next: express.NextFunction) => {
+    if (areValidationErrors(req, res)) return
+    if (!await doesSubscriptionExist({ uri: req.params.uri, res })) return
 
-    res.locals.subscription = subscription
     return next()
   }
 ]
@@ -78,5 +73,39 @@ export {
   areSubscriptionsExistValidator,
   userSubscriptionListValidator,
   userSubscriptionAddValidator,
-  userSubscriptionGetValidator
+  userSubscriptionGetValidator,
+  userSubscriptionDeleteValidator
+}
+
+// ---------------------------------------------------------------------------
+
+async function doesSubscriptionExist (options: {
+  uri: string
+  res: express.Response
+  state?: FollowState
+}) {
+  const { uri, res, state } = options
+
+  let [ name, host ] = uri.split('@')
+  if (host === WEBSERVER.HOST) host = null
+
+  const user = res.locals.oauth.token.User
+  const subscription = await ActorFollowModel.loadByActorAndTargetNameAndHostForAPI({
+    actorId: user.Account.Actor.id,
+    targetName: name,
+    targetHost: host,
+    state
+  })
+
+  if (!subscription?.ActorFollowing.VideoChannel) {
+    res.fail({
+      status: HttpStatusCode.NOT_FOUND_404,
+      message: `Subscription ${uri} not found.`
+    })
+    return false
+  }
+
+  res.locals.subscription = subscription
+
+  return true
 }