]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/helpers/webfinger.ts
Add RSS feed to subscribe button
[github/Chocobozzz/PeerTube.git] / server / helpers / webfinger.ts
index 76444fbe305e77e2eec5efb1650fdaa9636efd40..156376943dafee006e73d8ff5d97dfd34681814c 100644 (file)
@@ -2,7 +2,8 @@ import * as WebFinger from 'webfinger.js'
 import { WebFingerData } from '../../shared'
 import { ActorModel } from '../models/activitypub/actor'
 import { isTestInstance } from './core-utils'
-import { isActivityPubUrlValid } from './custom-validators/activitypub'
+import { isActivityPubUrlValid } from './custom-validators/activitypub/misc'
+import { CONFIG } from '../initializers'
 
 const webfinger = new WebFinger({
   webfist_fallback: false,
@@ -11,17 +12,33 @@ const webfinger = new WebFinger({
   request_timeout: 3000
 })
 
-async function loadActorUrlOrGetFromWebfinger (name: string, host: string) {
-  const actor = await ActorModel.loadByNameAndHost(name, host)
+async function loadActorUrlOrGetFromWebfinger (uriArg: string) {
+  // Handle strings like @toto@example.com
+  const uri = uriArg.startsWith('@') ? uriArg.slice(1) : uriArg
+
+  const [ name, host ] = uri.split('@')
+  let actor: ActorModel
+
+  if (host === CONFIG.WEBSERVER.HOST) {
+    actor = await ActorModel.loadLocalByName(name)
+  } else {
+    actor = await ActorModel.loadByNameAndHost(name, host)
+  }
+
   if (actor) return actor.url
 
-  const webfingerData: WebFingerData = await webfingerLookup(name + '@' + host)
+  return getUrlFromWebfinger(uri)
+}
+
+async function getUrlFromWebfinger (uri: string) {
+  const webfingerData: WebFingerData = await webfingerLookup(uri)
   return getLinkOrThrow(webfingerData)
 }
 
 // ---------------------------------------------------------------------------
 
 export {
+  getUrlFromWebfinger,
   loadActorUrlOrGetFromWebfinger
 }