/* Galvanic Corrosion - Rec Room custom server for communities. Copyright (C) 2025 @zombieb (Discord / proxnet Gitea) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ import Logging from "@proxnet/undead-logging"; import { Config } from "../config.ts"; const log = new Logging("Steam"); const config = Config.getConfig(); interface AuthenticateUserTicketSuccess { result: 'OK', steamid: string, ownersteamid: string, vacbanned: boolean, publisherbanned: boolean } interface AuthenticateUserTicketError { errorcode: number, errordesc: string } interface SteamRes { response: { error?: AuthenticateUserTicketError, params?: AuthenticateUserTicketSuccess } } export async function AuthenticateUserTicket(ticket: string, userid: string) { if (!config.auth.steamkey) return true; // always authenticate if no steam API key was found const params = new URLSearchParams(); params.append('key', config.auth.steamkey); params.append('appid', "471710"); params.append('ticket', ticket); try { const res = await fetch(`https://api.steampowered.com/ISteamUserAuth/AuthenticateUserTicket/v1?${params}`); const resjson = (await res.json()) as SteamRes; if (resjson.response.error) { log.w(`Steam Authentication failed: (${resjson.response.error.errorcode}) ${resjson.response.error.errordesc}`); // add more error codes later if needed const conditions = [ resjson.response.error.errorcode == 100 ].includes(true); if (conditions) log.w('This error indicates a client problem.'); return false; } log.d(JSON.stringify(resjson.response)); if (resjson.response.params) return resjson.response.params.steamid === userid && resjson.response.params.ownersteamid === userid; else { log.w("Steam Authentication failed: Steam response did not contain params or error! This should never be logged!"); return false; } } catch (err) { log.w(`Steam Authentication failed: ${(err as Error).message}`); return false; } } export * as Steam from "./steam.ts";