56 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /*
 | |
|  * SPDX-FileCopyrightText: syuilo and other misskey contributors
 | |
|  * SPDX-License-Identifier: AGPL-3.0-only
 | |
|  */
 | |
| 
 | |
| import { URL } from 'node:url';
 | |
| import { Injectable } from '@nestjs/common';
 | |
| import { query as urlQuery } from '@/misc/prelude/url.js';
 | |
| import { HttpRequestService } from '@/core/HttpRequestService.js';
 | |
| import { bindThis } from '@/decorators.js';
 | |
| 
 | |
| export type ILink = {
 | |
| 	href: string;
 | |
| 	rel?: string;
 | |
| };
 | |
| 
 | |
| export type IWebFinger = {
 | |
| 	links: ILink[];
 | |
| 	subject: string;
 | |
| };
 | |
| 
 | |
| const urlRegex = /^https?:\/\//;
 | |
| const mRegex = /^([^@]+)@(.*)/;
 | |
| 
 | |
| @Injectable()
 | |
| export class WebfingerService {
 | |
| 	constructor(
 | |
| 		private httpRequestService: HttpRequestService,
 | |
| 	) {
 | |
| 	}
 | |
| 
 | |
| 	@bindThis
 | |
| 	public async webfinger(query: string): Promise<IWebFinger> {
 | |
| 		const url = this.genUrl(query);
 | |
| 
 | |
| 		return await this.httpRequestService.getJson<IWebFinger>(url, 'application/jrd+json, application/json');
 | |
| 	}
 | |
| 
 | |
| 	@bindThis
 | |
| 	private genUrl(query: string): string {
 | |
| 		if (query.match(urlRegex)) {
 | |
| 			const u = new URL(query);
 | |
| 			return `${u.protocol}//${u.hostname}/.well-known/webfinger?` + urlQuery({ resource: query });
 | |
| 		}
 | |
| 
 | |
| 		const m = query.match(mRegex);
 | |
| 		if (m) {
 | |
| 			const hostname = m[2];
 | |
| 			const useHttp = process.env.MISSKEY_WEBFINGER_USE_HTTP && process.env.MISSKEY_WEBFINGER_USE_HTTP.toLowerCase() === 'true';
 | |
| 			return `http${useHttp ? '' : 's'}://${hostname}/.well-known/webfinger?${urlQuery({ resource: `acct:${query}` })}`;
 | |
| 		}
 | |
| 
 | |
| 		throw new Error(`Invalid query (${query})`);
 | |
| 	}
 | |
| }
 | 
