Skip to content

Commit b0669cc

Browse files
committed
Add support for dev tokens
1 parent 893fc25 commit b0669cc

4 files changed

Lines changed: 61 additions & 20 deletions

File tree

Cargo.lock

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "this_api_of_mine"
3-
version = "0.1.0"
3+
version = "0.2.0"
44
edition = "2024"
55

66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -10,6 +10,7 @@ actix-governor = "0.8"
1010
actix-web = "4.9"
1111
base64 = "0.22"
1212
cached = { version = "0.55", features = ["async"] }
13+
const_base = "0.2"
1314
chacha20poly1305 = { version = "0.10", features = ["std"] }
1415
confy = "0.6"
1516
deadpool-postgres = "0.14"

src/data/connection_token.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ pub struct ConnectionToken<'a> {
6464

6565
impl<'a> ConnectionToken<'a> {
6666
pub fn generate(
67-
token_key: chacha20poly1305::Key,
67+
token_key: &chacha20poly1305::Key,
6868
duration: Duration,
6969
server_address: ServerAddress<'a>,
7070
private_token: PrivateConnectionToken,
@@ -89,7 +89,7 @@ impl<'a> ConnectionToken<'a> {
8989
let mut private_token_bytes = private_token.to_bytes()?;
9090
private_token_bytes.resize(private_token_bytes.len() + XCHACHA20POLY1305_IETF_ABYTES, 0);
9191

92-
let mut cipher = XChaCha20Poly1305::new(&token_key);
92+
let mut cipher = XChaCha20Poly1305::new(token_key);
9393
cipher.encrypt_in_place(
9494
&nonce,
9595
additional_data_bytes.as_slice(),

src/routes/connection.rs

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,15 @@ use crate::errors::api::{ErrorCause, RouteError};
1414
use crate::errors::codes::ServerErrorCode;
1515
use 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)]
1823
struct 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

Comments
 (0)