the files

This commit is contained in:
niko
2026-10-14 06:59:51 +02:00
parent f6175893fc
commit 2040419525
1855 changed files with 6735668 additions and 0 deletions
@@ -0,0 +1,81 @@
using Campus_live_rewrite.api.dbs;
using Campus_live_rewrite.api.server;
using Campus_live_rewrite.api.server.Classes.db_class;
using Newtonsoft.Json;
/// <summary>
/// A banned account can still sign in to the WEBSITE (every page shows the ban banner with the
/// time left), but it can't change anything. This refuses every write a banned website session
/// makes - profile picture, banner, bio, email, photos, friends, reports, social links - with a
/// 403 the site shows as a message. One gate for all of them, so a route added later is covered
/// without anyone remembering to add a check.
///
/// Still allowed while banned: signing in and out, registering, the support desk (tickets are
/// how a player appeals) and dismissing notifications. Reads (GET) are never touched.
/// </summary>
public class SiteBanGateMiddleware
{
private readonly RequestDelegate _next;
public SiteBanGateMiddleware(RequestDelegate next) => _next = next;
private const string SiteCookie = "campus_site";
private static readonly string[] AllowedWhileBanned =
{
"/api/site/login", "/api/site/logout", "/api/site/register",
"/api/site/support/", "/api/site/notifications/",
};
private static bool IsWrite(string method) =>
HttpMethods.IsPost(method) || HttpMethods.IsPut(method) || HttpMethods.IsDelete(method) || HttpMethods.IsPatch(method);
public async Task Invoke(HttpContext context)
{
string path = context.Request.Path.Value ?? "";
bool siteWrite = IsWrite(context.Request.Method)
&& (path.StartsWith("/api/site/", StringComparison.OrdinalIgnoreCase)
|| path.Equals("/api/profile-image", StringComparison.OrdinalIgnoreCase));
if (!siteWrite || AllowedWhileBanned.Any(a => path.StartsWith(a, StringComparison.OrdinalIgnoreCase)))
{
await _next(context);
return;
}
ulong accountId = 0;
string token = context.Request.Cookies[SiteCookie] ?? "";
if (token.Length > 0)
{
string data = ClientSecurity.DecodeToken(token, requireSurface: "website");
if (!string.IsNullOrEmpty(data) && !data.StartsWith("error_"))
{
try { accountId = JsonConvert.DeserializeObject<player_info>(data)?.Id ?? 0; } catch { }
}
}
var ban = accountId == 0 ? null : PlayerDB.GetSiteBan(accountId);
if (ban == null)
{
await _next(context);
return;
}
string left = ban.RemainingSeconds == null ? "permanently" : "for " + Describe(ban.RemainingSeconds.Value);
Console.WriteLine($"[site-ban] refused {context.Request.Method} {path} from banned account {accountId}");
context.Response.StatusCode = 403;
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(JsonConvert.SerializeObject(new
{
ok = false,
banned = true,
error = $"This account is banned {left}. You can't change anything until the ban ends."
}));
}
public static string Describe(int seconds)
{
var t = TimeSpan.FromSeconds(seconds);
if (t.TotalDays >= 1) return $"{(int)t.TotalDays}d {t.Hours}h";
if (t.TotalHours >= 1) return $"{(int)t.TotalHours}h {t.Minutes}m";
if (t.TotalMinutes >= 1) return $"{(int)t.TotalMinutes}m";
return $"{t.Seconds}s";
}
}