Task 1-2: Guard fakeMachine / skipLifeGauge trên Production
Phase: 1 - Validation hardening Priority: High Module:
websocketDepends on: Không có Reference:docs/BountyHunter-Backend/details/feature-game-room-management/SPEC.md
Background
fakeMachine=true và skipLifeGauge=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:
RoomCmdConsumerlà một Spring@Component. InjectactiveProfilebằng@Valueannotation 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/skipLifeGaugefields thì apply guard tương tự trongonCreatePveFreePlayRoom() - Clarification: Nếu
CreatePVEFreePlayGameReqkhông có các flags này thì bỏ qua bước này
Verification / Acceptance Criteria
- [ ] Khi deploy với profile
main, gửiCREATE_PVE_SINGLE_PLAY_ROOMvớifakeMachine=true→ log warning xuất hiện,fakeMachinebị override thànhfalsetrước khi gọi service - [ ] Khi deploy với profile
dev, gửi request vớifakeMachine=true→ flag được giữ nguyên (không bị override) - [ ] Unit test: mock
activeProfile = "main", verifyreq.getFakeMachine()trả vềfalsesau guard - [ ] Unit test: mock
activeProfile = "dev", verify flag không bị thay đổi - [ ] Log message chứa
[SECURITY]prefix vàuserIdcủ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 (xemapplication-main.yaml) - Flags nên được log để audit khi có access attempt trên prod