From bdb38e5011005661a7f667a98c48be378ba65f79 Mon Sep 17 00:00:00 2001 From: akastijn Date: Tue, 5 Aug 2025 23:12:50 +0200 Subject: [PATCH] Add username retrieval functionality to `LoginController` using `RecentNamesMapper` query --- .../controllers/login/LoginController.java | 49 +++++++++++++++++++ .../database/litebans/RecentNamesMapper.java | 10 ++++ 2 files changed, 59 insertions(+) diff --git a/backend/src/main/java/com/alttd/altitudeweb/controllers/login/LoginController.java b/backend/src/main/java/com/alttd/altitudeweb/controllers/login/LoginController.java index 1595534..c07c00d 100644 --- a/backend/src/main/java/com/alttd/altitudeweb/controllers/login/LoginController.java +++ b/backend/src/main/java/com/alttd/altitudeweb/controllers/login/LoginController.java @@ -1,18 +1,26 @@ package com.alttd.altitudeweb.controllers.login; import com.alttd.altitudeweb.api.LoginApi; +import com.alttd.altitudeweb.database.litebans.HistoryRecord; +import com.alttd.altitudeweb.database.litebans.RecentNamesMapper; +import com.alttd.altitudeweb.database.litebans.UUIDHistoryMapper; import com.alttd.altitudeweb.model.PermissionClaimDto; import com.alttd.altitudeweb.database.Databases; import com.alttd.altitudeweb.database.web_db.PrivilegedUser; import com.alttd.altitudeweb.database.web_db.PrivilegedUserMapper; +import com.alttd.altitudeweb.model.UsernameDto; import com.alttd.altitudeweb.setup.Connection; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.scheduling.annotation.Scheduled; import com.alttd.altitudeweb.services.limits.RateLimit; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.security.oauth2.jwt.JwtClaimsSet; import org.springframework.security.oauth2.jwt.JwtEncoder; import org.springframework.security.oauth2.jwt.JwtEncoderParameters; @@ -83,6 +91,47 @@ public class LoginController implements LoginApi { return ResponseEntity.ok(loginCode); } + @Override + public ResponseEntity getUsername() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication == null || !(authentication.getPrincipal() instanceof OAuth2ResourceServerProperties.Jwt)) { + return ResponseEntity.status(401).build(); + } + Jwt jwt = (Jwt) authentication.getPrincipal(); + String stringUuid = jwt.getSubject(); + UUID uuid; + try { + uuid = UUID.fromString(stringUuid); + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().build(); + } + + UsernameDto usernameDto = new UsernameDto(); + usernameDto.setUsername(getUsername(uuid)); + + return ResponseEntity.ok(usernameDto); + } + + private String getUsername(UUID uuid) { + CompletableFuture username = new CompletableFuture<>(); + + Connection.getConnection(Databases.LITE_BANS) + .runQuery(sqlSession -> { + log.debug("Loading all history through logged in uuid"); + try { + String temp = sqlSession + .getMapper(RecentNamesMapper.class) + .getUsername(uuid.toString()); + username.complete(temp); + } catch (Exception e) { + log.error("Failed to find username for uuid {}", uuid, e); + username.completeExceptionally(e); + } + }); + return username.join(); + } + @RateLimit(limit = 5, timeValue = 1, timeUnit = TimeUnit.MINUTES, key = "login") @Override public ResponseEntity login(String code) { diff --git a/database/src/main/java/com/alttd/altitudeweb/database/litebans/RecentNamesMapper.java b/database/src/main/java/com/alttd/altitudeweb/database/litebans/RecentNamesMapper.java index 5b8c15c..0cc217d 100644 --- a/database/src/main/java/com/alttd/altitudeweb/database/litebans/RecentNamesMapper.java +++ b/database/src/main/java/com/alttd/altitudeweb/database/litebans/RecentNamesMapper.java @@ -7,6 +7,16 @@ import java.util.ArrayList; import java.util.List; public interface RecentNamesMapper { + + @Select(""" + SELECT DISTINCT name AS username + FROM litebans_history + WHERE uuid = #{uuid} + ORDER BY date DESC; + """) + String getUsername(@Param("uuid") String uuid); + + @Select(""" SELECT DISTINCT user_lookup.name AS punished_name FROM ${tableName} AS punishment