@@ -14,9 +14,15 @@ use crate::errors::api::{ErrorCause, RouteError};
1414use crate :: errors:: codes:: ServerErrorCode ;
1515use crate :: routes:: players:: validate_player_token;
1616
17+ const DEV_TOKEN : & [ u8 ] = const_base:: decode!(
18+ "Unsecure+Developer+Token+Giving+Admin+Perms=" ,
19+ const_base:: Config :: B64
20+ ) ;
21+
1722#[ derive( Deserialize ) ]
1823struct GameConnectionParams {
1924 token : String ,
25+ dev : Option < bool > ,
2026}
2127
2228#[ post( "/v1/game/connect" ) ]
@@ -28,6 +34,8 @@ async fn game_connect(
2834 let pg_client = pg_pool. get ( ) . await ?;
2935 let player_id = validate_player_token ( & pg_client, & params. token ) . await ?;
3036
37+ let is_dev = params. dev . unwrap_or ( false ) ;
38+
3139 // TODO(SirLynix): to do this with only one query
3240 let find_player_info = pg_client
3341 . prepare_typed_cached (
@@ -36,13 +44,6 @@ async fn game_connect(
3644 )
3745 . await ?;
3846
39- let get_player_permissions = pg_client
40- . prepare_typed_cached (
41- "SELECT permission FROM player_permissions WHERE player_id = $1" ,
42- & [ Type :: INT4 ] ,
43- )
44- . await ?;
45-
4647 let player_result = pg_client
4748 . query_opt ( & find_player_info, & [ & player_id] )
4849 . await ?
@@ -53,17 +54,27 @@ async fn game_connect(
5354
5455 let uuid: Uuid = player_result. try_get ( 0 ) ?;
5556 let nickname: String = player_result. try_get ( 1 ) ?;
56- let permissions: Vec < String > = pg_client
57- . query_raw ( & get_player_permissions, & [ & player_id] )
58- . await ?
59- . map ( |row : Result < Row , tokio_postgres:: Error > | row. and_then ( |row| row. try_get ( 0 ) ) )
60- . try_collect ( )
61- . await ?;
6257
63- let player_data = PlayerData :: new ( uuid, nickname, permissions) ;
58+ let permissions: Vec < String > ;
59+ if !is_dev {
60+ let get_player_permissions = pg_client
61+ . prepare_typed_cached (
62+ "SELECT permission FROM player_permissions WHERE player_id = $1" ,
63+ & [ Type :: INT4 ] ,
64+ )
65+ . await ?;
6466
65- let server_address =
66- ServerAddress :: new ( config. game_server_address . as_str ( ) , config. game_server_port ) ;
67+ permissions = pg_client
68+ . query_raw ( & get_player_permissions, & [ & player_id] )
69+ . await ?
70+ . map ( |row : Result < Row , tokio_postgres:: Error > | row. and_then ( |row| row. try_get ( 0 ) ) )
71+ . try_collect ( )
72+ . await ?;
73+ } else {
74+ permissions = vec ! [ "admin" . into( ) , "dev" . into( ) ] ;
75+ }
76+
77+ let player_data = PlayerData :: new ( uuid, nickname, permissions) ;
6778
6879 let refresh_token =
6980 GameDataToken :: new_refresh ( player_id, uuid, config. game_api_refresh_token_duration ) ;
@@ -79,8 +90,21 @@ async fn game_connect(
7990 player_data,
8091 ) ;
8192
93+ let server_address = if !is_dev {
94+ ServerAddress :: new ( config. game_server_address . as_str ( ) , config. game_server_port )
95+ } else {
96+ ServerAddress :: new ( "localhost" , config. game_server_port )
97+ } ;
98+
99+ // force connection token key to be zero in dev mode to ensure it can't be used to connect to a regular server
100+ let connection_token_key = chacha20poly1305:: Key :: from_slice ( if !is_dev {
101+ & config. connection_token_key
102+ } else {
103+ DEV_TOKEN
104+ } ) ;
105+
82106 let token = ConnectionToken :: generate (
83- config . connection_token_key . into ( ) ,
107+ connection_token_key,
84108 config. connection_token_duration ,
85109 server_address,
86110 private_token,
0 commit comments