upd: change parser and fix fetchAccessToken

This commit is contained in:
Mar0xy 2023-09-24 23:18:39 +02:00
parent 30cc0a9b18
commit 37d7a4b604
No known key found for this signature in database
GPG key ID: 56569BBE47D2C828
2 changed files with 41 additions and 18 deletions

View file

@ -1,5 +1,6 @@
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import megalodon, { Entity, MegalodonInterface } from 'megalodon'; import megalodon, { Entity, MegalodonInterface } from 'megalodon';
import querystring from 'querystring';
import { IsNull } from 'typeorm'; import { IsNull } from 'typeorm';
import multer from 'fastify-multer'; import multer from 'fastify-multer';
import type { UsersRepository } from '@/models/_.js'; import type { UsersRepository } from '@/models/_.js';
@ -45,13 +46,20 @@ export class MastodonApiServerService {
done(); done();
}); });
fastify.addContentTypeParser(['application/x-www-form-urlencoded'], { parseAs: 'string' }, (req, body, done) => { fastify.addContentTypeParser('application/x-www-form-urlencoded', function (request, payload, done) {
const dataObj: any = {}; let body = '';
const parsedData = new URLSearchParams(body as string); payload.on('data', function (data) {
for (const pair of parsedData.entries()) { body += data;
dataObj[pair[0]] = pair[1]; });
payload.on('end', function () {
try {
const parsed = querystring.parse(body);
done(null, parsed);
} catch (e: any) {
done(e);
} }
done(null, dataObj); });
payload.on('error', done);
}); });
fastify.register(multer.contentParser); fastify.register(multer.contentParser);

View file

@ -5,6 +5,7 @@
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import megalodon, { MegalodonInterface } from 'megalodon'; import megalodon, { MegalodonInterface } from 'megalodon';
import querystring from 'querystring';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
/* import { kinds } from '@/misc/api-permissions.js'; /* import { kinds } from '@/misc/api-permissions.js';
import type { Config } from '@/config.js'; import type { Config } from '@/config.js';
@ -12,6 +13,14 @@ import { DI } from '@/di-symbols.js'; */
import { bindThis } from '@/decorators.js'; import { bindThis } from '@/decorators.js';
import type { FastifyInstance } from 'fastify'; import type { FastifyInstance } from 'fastify';
function getClient(BASE_URL: string, authorization: string | undefined): MegalodonInterface {
const accessTokenArr = authorization?.split(' ') ?? [null];
const accessToken = accessTokenArr[accessTokenArr.length - 1];
const generator = (megalodon as any).default;
const client = generator('misskey', BASE_URL, accessToken) as MegalodonInterface;
return client;
}
@Injectable() @Injectable()
export class OAuth2ProviderService { export class OAuth2ProviderService {
constructor( constructor(
@ -42,13 +51,20 @@ export class OAuth2ProviderService {
done(); done();
}); });
fastify.addContentTypeParser(['application/x-www-form-urlencoded'], { parseAs: 'string' }, (req, body, done) => { fastify.addContentTypeParser('application/x-www-form-urlencoded', function (request, payload, done) {
const dataObj: any = {}; let body = '';
const parsedData = new URLSearchParams(body as string); payload.on('data', function (data) {
for (const pair of parsedData.entries()) { body += data;
dataObj[pair[0]] = pair[1]; });
payload.on('end', function () {
try {
const parsed = querystring.parse(body);
done(null, parsed);
} catch (e: any) {
done(e);
} }
done(null, dataObj); });
payload.on('error', done);
}); });
fastify.get('/oauth/authorize', async (request, reply) => { fastify.get('/oauth/authorize', async (request, reply) => {
@ -75,8 +91,7 @@ export class OAuth2ProviderService {
} }
let client_id: any = body.client_id; let client_id: any = body.client_id;
const BASE_URL = `${request.protocol}://${request.hostname}`; const BASE_URL = `${request.protocol}://${request.hostname}`;
const generator = (megalodon as any).default; const client = getClient(BASE_URL, '');
const client = generator(BASE_URL, null) as MegalodonInterface;
let token = null; let token = null;
if (body.code) { if (body.code) {
//m = body.code.match(/^([a-zA-Z0-9]{8})([a-zA-Z0-9]{4})([a-zA-Z0-9]{4})([a-zA-Z0-9]{4})([a-zA-Z0-9]{12})/); //m = body.code.match(/^([a-zA-Z0-9]{8})([a-zA-Z0-9]{4})([a-zA-Z0-9]{4})([a-zA-Z0-9]{4})([a-zA-Z0-9]{12})/);
@ -107,8 +122,8 @@ export class OAuth2ProviderService {
}; };
reply.send(ret); reply.send(ret);
} catch (err: any) { } catch (err: any) {
/* console.error(err); */ console.error(err);
reply.code(401).send(err.response); reply.code(401).send(err.response.data);
} }
}); });
} }