lsp-yggdrasil/src/routes/session.js

177 lines
5.3 KiB
JavaScript
Raw Normal View History

2022-05-09 14:09:08 +00:00
import { getOverrideHandler, getOverridePreHandler } from '../config.js'
2022-05-11 00:58:06 +00:00
import { toSymboUUID } from '../generator.js'
import { getPlayerSerialization, Player, PlayerSeriliazationSchema } from '../models/player.js'
import { Token } from '../models/token.js'
2022-05-09 14:09:08 +00:00
/*
Key: string Username
Value: {
accessToken: string,
serverId: string,
ip: string
}
*/
const joinServerRequest = new Map()
export const join = {
method: 'POST',
url: '/sessionserver/session/minecraft/join',
schema: {
2022-05-18 07:47:15 +00:00
summary: "加入服务器",
description: "详情请见 authlib-injector 文档。",
tags: [ "Sessionserver" ],
2022-05-09 14:09:08 +00:00
body: {
"accessToken": {
"type": "string"
},
"selectedProfile": {
"type": "string"
},
"serverId": {
"type": "string"
},
},
response: {
204: {
type: "null"
}
}
},
preHandler: getOverridePreHandler('/sessionserver/session/minecraft/join'),
handler: getOverrideHandler('/sessionserver/session/minecraft/join') ?? async function (req, rep) {
const { accessToken, selectedProfile, serverId } = req.body
const user = await await Player.findOne({ uuid: toSymboUUID(selectedProfile) })
2022-05-09 14:09:08 +00:00
if (!user) {
return await rep.code(400).send({
error: "IllegalArgumentException",
errorMessage: "请求内容不正确",
cause: "用户不存在"
})
}
const session = await Token.findOne({ token: accessToken })
2022-05-09 14:09:08 +00:00
if (!session) {
return await rep.code(401).send({
error: "IllegalArgumentException",
errorMessage: "无效会话",
cause: "无效会话"
})
}
if (Date.now() > session.expireDate) {
return await rep.code(401).send({
error: "IllegalArgumentException",
errorMessage: "无效会话",
cause: "会话已过期"
})
}
joinServerRequest.set(session.uuid, {
2022-05-11 00:58:06 +00:00
accessToken: accessToken,
serverId: serverId,
ip: req.headers['x-forwarded-for'] || req.ip
2022-05-09 14:09:08 +00:00
})
await rep.code(204).send()
}
}
export const hasJoined = {
method: 'GET',
url: '/sessionserver/session/minecraft/hasJoined',
schema: {
2022-05-18 07:47:15 +00:00
summary: "查询是否已加入服务器",
description: "详情请见 authlib-injector 文档。",
tags: [ "Sessionserver" ],
2022-05-09 14:09:08 +00:00
query: {
"username": {
"type": "string"
},
"serverId": {
"type": "string"
},
"ip": {
"type": "string"
}
},
response: {
200: PlayerSeriliazationSchema,
204: {
type: "null"
}
}
},
preHandler: getOverridePreHandler('/sessionserver/session/minecraft/hasJoined'),
handler: getOverrideHandler('/sessionserver/session/minecraft/hasJoined') ?? async function (req, rep) {
const { username, serverId, ip } = req.query
2022-05-11 00:58:06 +00:00
const player = await Player.findOne({ username })
2022-05-11 00:58:06 +00:00
if (!player) {
return await rep.code(400).send({
error: "IllegalArgumentException",
errorMessage: "请求内容不正确",
cause: "用户不存在"
})
}
const request = joinServerRequest.get(player.uuid)
this.log.info(request)
2022-05-09 14:09:08 +00:00
if(ip) {
2022-05-11 00:58:06 +00:00
if(ip !== request.ip) {
2022-05-09 14:09:08 +00:00
return await rep.code(401).send({
error: "IllegalArgumentException",
errorMessage: "无效会话",
cause: "IP 不匹配"
})
}
}
2022-05-11 00:58:06 +00:00
if(serverId !== request.serverId) {
2022-05-09 14:09:08 +00:00
return await rep.code(401).send({
error: "IllegalArgumentException",
errorMessage: "无效会话",
cause: "服务器 ID 不匹配"
})
}
await rep.code(200).send(getPlayerSerialization(player))
}
}
export const profile = {
method: 'GET',
url: '/sessionserver/session/minecraft/profile/:uuid',
schema: {
2022-05-18 07:47:15 +00:00
summary: "获取玩家 Profile",
description: "详情请见 authlib-injector 文档。",
tags: [ "Sessionserver" ],
2022-05-09 14:09:08 +00:00
params: {
"uuid": {
"type": "string"
},
unsigned: {
2022-05-18 07:47:15 +00:00
"type": "boolean",
"optional": true
2022-05-09 14:09:08 +00:00
},
},
response: {
200: PlayerSeriliazationSchema,
204: {
type: "null"
}
}
},
preHandler: getOverridePreHandler('/sessionserver/session/minecraft/profile/:uuid'),
handler: getOverrideHandler('/sessionserver/session/minecraft/profile/:uuid') ?? async function (req, rep) {
const { uuid } = req.params
const player = await Player.findOne({ uuid: toSymboUUID(uuid) })
2022-05-09 14:09:08 +00:00
if (!player) {
return await rep.code(204).send()
}
await rep.code(200).send(getPlayerSerialization(player))
}
}