Skip to content

Task 1-2: Guard fakeMachine / skipLifeGauge trên Production

Phase: 1 - Validation hardening Priority: High Module: websocket Depends on: Không có Reference: docs/BountyHunter-Backend/details/feature-game-room-management/SPEC.md

Background

fakeMachine=trueskipLifeGauge=true trong CreatePVESinglePlayGameReq bỏ qua IoT device check và life gauge deduction. Không có production guard nên có thể bị dùng sai.

Tasks

File: websocket/handler/consumer_handler/RoomCmdConsumer.java

DI Note: RoomCmdConsumer là một Spring @Component. Inject activeProfile bằng @Value annotation trực tiếp vào field của class. Không cần constructor injection riêng — Spring tự inject trước khi gọi handler methods.

  • [ ] Inject active profile vào field của RoomCmdConsumer:

    // Thêm field này vào class RoomCmdConsumer (cùng chỗ với các @Autowired fields khác)
    @Value("${spring.profiles.active:dev}")
    private String activeProfile;
    

  • [ ] Override flags khi profile là main:

    // In onCreatePveSinglePlayRoom() before calling createRoomService:
    // Clarification: đoạn code này đặt TRƯỚC khi gọi createRoomService.createPveSinglePlayRoom(req, userId)
    if ("main".equals(activeProfile)) {
        if (Boolean.TRUE.equals(req.getFakeMachine()) || Boolean.TRUE.equals(req.getSkipLifeGauge())) {
            LOGGER.warn("[SECURITY] fakeMachine/skipLifeGauge attempted on prod by user {}, overriding to false", userId);
        }
        req.setFakeMachine(false);
        req.setSkipLifeGauge(false);
    }
    

  • [ ] Kiểm tra CreatePVEFreePlayGameReq — nếu cũng có fakeMachine / skipLifeGauge fields thì apply guard tương tự trong onCreatePveFreePlayRoom()

  • Clarification: Nếu CreatePVEFreePlayGameReq không có các flags này thì bỏ qua bước này

Verification / Acceptance Criteria

  • [ ] Khi deploy với profile main, gửi CREATE_PVE_SINGLE_PLAY_ROOM với fakeMachine=true → log warning xuất hiện, fakeMachine bị override thành false trước khi gọi service
  • [ ] Khi deploy với profile dev, gửi request với fakeMachine=true → flag được giữ nguyên (không bị override)
  • [ ] Unit test: mock activeProfile = "main", verify req.getFakeMachine() trả về false sau guard
  • [ ] Unit test: mock activeProfile = "dev", verify flag không bị thay đổi
  • [ ] Log message chứa [SECURITY] prefix và userId của người dùng khi attempt trên prod
  • [ ] Không có thay đổi logic nghiệp vụ ngoài việc override flags

Files to Modify

  • websocket/src/main/java/com/figpop/websocket/handler/consumer_handler/RoomCmdConsumer.java

Notes

  • Profile main = production environment (xem application-main.yaml)
  • Flags nên được log để audit khi có access attempt trên prod