*** Settings *** Documentation Jail Management feature coverage — list, detail, controls, ... ban/unban, currently banned, IP lookup, ignore list. Resource ${CURDIR}/../resources/common.resource Resource ${CURDIR}/../resources/auth.resource Suite Setup Wait For Backend Health *** Test Cases *** Jails Page Lists Active Jails [Documentation] Jails page shows active jails with name and metrics. Login As Admin Go To ${FRONTEND_URL}/jails Wait For Elements State css=[data-testid="jails-page"] visible timeout=15s Page Should Contain Jails Close Browser Jails API Returns Active Jails Set Random Xff Header Login Via HTTP ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= GET On Session bangsess /api/v1/jails headers=${headers} expected_status=200 ${body}= Set Variable ${resp.json()} Dictionary Should Contain Key ${body} items Jail Detail Page Loads For First Active Jail [Documentation] Visiting /jails/ for a real active jail shows the detail view. Login As Admin Set Random Xff Header Login Via HTTP ${jail}= Get First Active Jail Name Log Using jail: ${jail} Go To ${FRONTEND_URL}/jails/${jail} Wait For Load State domcontentloaded FOR ${i} IN RANGE 1 16 ${found}= Run Keyword And Return Status ... Wait For Elements State css=[data-testid="jail-detail-page"] visible timeout=2s IF ${found} BREAK Sleep 1s END Page Should Contain ${jail} Close Browser Ban An IP Via API [Documentation] POST /api/v1/bans bans an IP in a specific jail. Set Random Xff Header Login Via HTTP ${jail}= Get First Active Jail Name ${ip}= Generate Unique Ip ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${payload}= Create Dictionary jail ${jail} ip ${ip} ${resp}= POST On Session bangsess /api/v1/bans json=${payload} ... headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 201, 204] msg=Unexpected ban status: ${resp.status_code} Set Suite Variable ${BANNED_IP} ${ip} Set Suite Variable ${BANNED_JAIL} ${jail} Unban The IP We Just Banned [Documentation] DELETE /api/v1/bans removes an IP from a specific jail. Set Random Xff Header Login Via HTTP ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${payload}= Create Dictionary jail ${BANNED_JAIL} ip ${BANNED_IP} ${resp}= DELETE On Session bangsess /api/v1/bans json=${payload} ... headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 204] msg=Unexpected unban status: ${resp.status_code} Unban All Endpoint Accepts Request Set Random Xff Header Login Via HTTP ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= DELETE On Session bangsess /api/v1/bans/all ... headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 204, 429] msg=Unexpected unban-all status: ${resp.status_code} Active Bans Endpoint Returns List Set Random Xff Header Login Via HTTP ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= GET On Session bangsess /api/v1/bans/active ... headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 204] IP Lookup Endpoint Returns Geo [Documentation] GET /api/v1/geo/lookup/{ip} returns enrichment data. Set Random Xff Header Login Via HTTP ${ip}= Generate Unique Ip ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= GET On Session bangsess /api/v1/geo/lookup/${ip} ... headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 404] msg=Unexpected lookup status: ${resp.status_code} Ignore List Add And Remove Via API [Documentation] POST /api/v1/jails/{name}/ignoreip adds an IP to the ignore list. Set Random Xff Header Login Via HTTP ${jail}= Get First Active Jail Name ${ip}= Generate Unique Ip ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${payload}= Create Dictionary ip ${ip} ${add_resp}= POST On Session bangsess /api/v1/jails/${jail}/ignoreip ... json=${payload} headers=${headers} expected_status=any Should Be True ${add_resp.status_code} in [200, 201, 204] ${del_resp}= DELETE On Session bangsess /api/v1/jails/${jail}/ignoreip ... json=${payload} headers=${headers} expected_status=any Should Be True ${del_resp.status_code} in [200, 204] Ignore Self Toggle Via API Set Random Xff Header Login Via HTTP ${jail}= Get First Active Jail Name ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= POST On Session bangsess /api/v1/jails/${jail}/ignoreself ... json=${EMPTY} headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 204] Jail Reload Endpoint Works Set Random Xff Header Login Via HTTP ${jail}= Get First Active Jail Name ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= POST On Session bangsess /api/v1/jails/${jail}/reload ... json=${EMPTY} headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 204] Jail Stop Endpoint Works Set Random Xff Header Login Via HTTP ${jail}= Get First Active Jail Name ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= POST On Session bangsess /api/v1/jails/${jail}/stop ... json=${EMPTY} headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 204, 400, 403] msg=Unexpected stop status: ${resp.status_code} Jail Start Endpoint Works Set Random Xff Header Login Via HTTP ${jail}= Get First Active Jail Name ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= POST On Session bangsess /api/v1/jails/${jail}/start ... json=${EMPTY} headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 204, 400, 403] Jail Idle Endpoint Works Set Random Xff Header Login Via HTTP ${jail}= Get First Active Jail Name ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= POST On Session bangsess /api/v1/jails/${jail}/idle ... json=${EMPTY} headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 204, 400, 403] Reload All Jails Endpoint Works Set Random Xff Header Login Via HTTP ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= POST On Session bangsess /api/v1/jails/reload-all ... json=${EMPTY} headers=${headers} expected_status=any Should Be True ${resp.status_code} in [200, 204] Geo Stats Endpoint Returns Counters Set Random Xff Header Login Via HTTP ${headers}= Create Dictionary X-BanGUI-Request 1 Set To Dictionary ${headers} X-Forwarded-For ${XFF_HEADER} ${resp}= GET On Session bangsess /api/v1/geo/stats ... headers=${headers} expected_status=any Should Be Equal As Integers ${resp.status_code} 200