summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/api-handler.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/server/api/api-handler.ts')
-rw-r--r--packages/backend/src/server/api/api-handler.ts43
1 files changed, 42 insertions, 1 deletions
diff --git a/packages/backend/src/server/api/api-handler.ts b/packages/backend/src/server/api/api-handler.ts
index f97c3dd397..34ff970b4c 100644
--- a/packages/backend/src/server/api/api-handler.ts
+++ b/packages/backend/src/server/api/api-handler.ts
@@ -1,12 +1,25 @@
import Koa from 'koa';
+import { User } from '@/models/entities/user.js';
+import { UserIps } from '@/models/index.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
import { IEndpoint } from './endpoints.js';
import authenticate, { AuthenticationError } from './authenticate.js';
import call from './call.js';
import { ApiError } from './error.js';
+const userIpHistories = new Map<User['id'], Set<string>>();
+
+setInterval(() => {
+ userIpHistories.clear();
+}, 1000 * 60 * 60);
+
export default (endpoint: IEndpoint, ctx: Koa.Context) => new Promise<void>((res) => {
- const body = ctx.request.body;
+ const body = ctx.is('multipart/form-data')
+ ? (ctx.request as any).body
+ : ctx.method === 'GET'
+ ? ctx.query
+ : ctx.request.body;
const reply = (x?: any, y?: ApiError) => {
if (x == null) {
@@ -33,10 +46,38 @@ export default (endpoint: IEndpoint, ctx: Koa.Context) => new Promise<void>((res
authenticate(body['i']).then(([user, app]) => {
// API invoking
call(endpoint.name, user, app, body, ctx).then((res: any) => {
+ if (ctx.method === 'GET' && endpoint.meta.cacheSec && !body['i'] && !user) {
+ ctx.set('Cache-Control', `public, max-age=${endpoint.meta.cacheSec}`);
+ }
reply(res);
}).catch((e: ApiError) => {
reply(e.httpStatusCode ? e.httpStatusCode : e.kind === 'client' ? 400 : 500, e);
});
+
+ // Log IP
+ if (user) {
+ fetchMeta().then(meta => {
+ if (!meta.enableIpLogging) return;
+ const ip = ctx.ip;
+ const ips = userIpHistories.get(user.id);
+ if (ips == null || !ips.has(ip)) {
+ if (ips == null) {
+ userIpHistories.set(user.id, new Set([ip]));
+ } else {
+ ips.add(ip);
+ }
+
+ try {
+ UserIps.insert({
+ createdAt: new Date(),
+ userId: user.id,
+ ip: ip,
+ });
+ } catch {
+ }
+ }
+ });
+ }
}).catch(e => {
if (e instanceof AuthenticationError) {
reply(403, new ApiError({