Skip to content

Commit 9b29f77

Browse files
committed
backend: remove the database fields for WgKeys in use
1 parent 3d9440e commit 9b29f77

File tree

10 files changed

+68
-85
lines changed

10 files changed

+68
-85
lines changed

backend/src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,27 @@ pub(crate) mod tests {
308308
web::Data::new(state)
309309
}
310310

311+
pub async fn mark_keys_as_in_use(state: &web::Data<AppState>, key_ids: Vec<uuid::Uuid>) {
312+
let mut keys_in_use = state.keys_in_use.lock().await;
313+
for key_id in key_ids {
314+
keys_in_use.insert(key_id);
315+
}
316+
}
317+
318+
pub async fn get_charger_key_ids(
319+
state: &web::Data<AppState>,
320+
charger_uuid: uuid::Uuid,
321+
) -> Vec<uuid::Uuid> {
322+
use db_connector::schema::wg_keys::dsl::*;
323+
324+
let mut conn = state.pool.get().unwrap();
325+
wg_keys
326+
.filter(charger_id.eq(charger_uuid))
327+
.select(id)
328+
.load::<uuid::Uuid>(&mut conn)
329+
.unwrap_or_default()
330+
}
331+
311332
pub fn configure(cfg: &mut ServiceConfig) {
312333
let pool = db_connector::test_connection_pool();
313334

backend/src/main.rs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,20 @@
1919

2020
mod monitoring;
2121

22-
use std::{collections::{HashMap, HashSet}, net::UdpSocket, num::NonZeroUsize, sync::Arc, time::Duration};
22+
use std::{
23+
collections::{HashMap, HashSet},
24+
net::UdpSocket,
25+
num::NonZeroUsize,
26+
sync::Arc,
27+
time::Duration,
28+
};
2329

2430
use actix::Arbiter;
2531
pub use backend::*;
2632
use backend::{rate_limit::IPRateLimiter, utils::get_connection};
2733

2834
use actix_web::{middleware::Logger, web, App, HttpServer};
29-
use db_connector::{get_connection_pool, run_migrations, Pool};
30-
use diesel::prelude::*;
35+
use db_connector::{get_connection_pool, run_migrations};
3136
use futures_util::lock::Mutex;
3237
use lettre::{transport::smtp::authentication::Credentials, SmtpTransport};
3338
use lru::LruCache;
@@ -40,16 +45,6 @@ use udp_server::packet::{
4045
ManagementPacketHeader,
4146
};
4247

43-
fn reset_wg_keys(pool: &Pool) {
44-
use db_connector::schema::wg_keys::dsl::*;
45-
46-
let mut conn = pool.get().unwrap();
47-
diesel::update(wg_keys)
48-
.set(in_use.eq(false))
49-
.execute(&mut conn)
50-
.unwrap();
51-
}
52-
5348
fn cleanup_thread(state: web::Data<AppState>) {
5449
loop {
5550
std::thread::sleep(Duration::from_secs(60));
@@ -129,8 +124,6 @@ async fn main() -> std::io::Result<()> {
129124
let mut conn = pool.get().expect("Failed to get connection from pool");
130125
run_migrations(&mut conn).expect("Failed to run migrations");
131126

132-
reset_wg_keys(&pool);
133-
134127
let mailer = {
135128
let email = std::env::var("EMAIL_USER").expect("EMAIL_USER must be set");
136129
let pass = std::env::var("EMAIL_PASS").expect("EMAIL_PASS must be set");

backend/src/routes/charger/add.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,6 @@ async fn add_wg_key(
396396
id: uuid::Uuid::new_v4(),
397397
user_id: uid,
398398
charger_id: cid,
399-
in_use: false,
400399
charger_pub: keys.charger_public,
401400
web_private: keys.web_private,
402401
psk: keys.psk,

backend/src/routes/charger/allow_user.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ async fn add_keys(
7979
id: uuid::Uuid::new_v4(),
8080
user_id: uid,
8181
charger_id: cid,
82-
in_use: false,
8382
charger_pub: key.charger_public,
8483
web_private: key.web_private,
8584
psk: key.psk,

backend/src/routes/charger/get_key.rs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -93,19 +93,21 @@ pub async fn get_key(
9393
})
9494
.await?;
9595

96-
// Count how many are in use
97-
charger_key_ids.iter().filter(|key_id| keys_in_use_cache.contains(*key_id)).count()
96+
charger_key_ids
97+
.into_iter()
98+
.filter(|key_id| keys_in_use_cache.contains(key_id))
99+
.collect::<Vec<_>>()
98100
};
99101

100-
if keys_in_use_count >= 5 {
102+
if keys_in_use_count.len() >= 5 {
101103
return Err(Error::AllKeysInUse.into());
102104
}
103105

104106
let mut conn = get_connection(&state)?;
105107
let key: Option<WgKey> = web_block_unpacked(move || {
106108
match WgKey::belonging_to(&user)
107109
.filter(charger_id.eq(&cid))
108-
.filter(in_use.eq(false))
110+
.filter(id.ne_all(keys_in_use_count))
109111
.select(WgKey::as_select())
110112
.get_result(&mut conn)
111113
{
@@ -134,15 +136,16 @@ pub async fn get_key(
134136

135137
#[cfg(test)]
136138
mod tests {
137-
use std::str::FromStr;
138-
139139
use super::*;
140140
use actix_web::{cookie::Cookie, test, App};
141-
use db_connector::test_connection_pool;
142141
use rand::TryRngCore;
143142
use rand_core::OsRng;
144143

145-
use crate::{middleware::jwt::JwtMiddleware, routes::user::tests::TestUser, tests::configure};
144+
use crate::{
145+
middleware::jwt::JwtMiddleware,
146+
routes::user::tests::TestUser,
147+
tests::{configure, get_charger_key_ids, mark_keys_as_in_use},
148+
};
146149

147150
#[actix_web::test]
148151
async fn test_get_key() {
@@ -168,26 +171,23 @@ mod tests {
168171
}
169172

170173
#[actix_web::test]
171-
async fn test_get_key_none_left() {
172-
use db_connector::schema::wg_keys::dsl::*;
174+
async fn test_get_key_all_keys_in_use() {
175+
use std::str::FromStr;
173176

174177
let (mut user, _) = TestUser::random().await;
175178
user.login().await;
176179

177180
let charger_uid = OsRng.try_next_u32().unwrap() as i32;
178181
let charger = user.add_charger(charger_uid).await;
179182

180-
let pool = test_connection_pool();
181-
let mut conn = pool.get().unwrap();
183+
let state = crate::tests::create_test_state(None);
184+
let charger_uuid = uuid::Uuid::from_str(&charger.uuid).unwrap();
185+
let key_ids = get_charger_key_ids(&state, charger_uuid).await;
182186

183-
diesel::update(wg_keys)
184-
.filter(charger_id.eq(uuid::Uuid::from_str(&charger.uuid).unwrap()))
185-
.set(in_use.eq(true))
186-
.execute(&mut conn)
187-
.unwrap();
187+
mark_keys_as_in_use(&state, key_ids).await;
188188

189189
let app = App::new()
190-
.configure(configure)
190+
.app_data(state)
191191
.wrap(JwtMiddleware)
192192
.service(get_key);
193193
let app = test::init_service(app).await;
@@ -197,6 +197,7 @@ mod tests {
197197
.cookie(Cookie::new("access_token", user.get_access_token()))
198198
.to_request();
199199

200+
// Should fail with 404 since all keys are in use
200201
let resp = test::call_service(&app, req).await;
201202
assert!(resp.status().is_client_error());
202203
assert_eq!(resp.status().as_u16(), 404);

backend/src/ws_udp_bridge.rs

Lines changed: 14 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -156,27 +156,13 @@ impl WebClient {
156156
}
157157

158158
pub async fn stop(self) {
159-
use db_connector::schema::wg_keys::dsl::*;
160-
161159
log::debug!("Closed connection to charger '{}'", self.charger_id);
162160

163161
{
164162
let mut keys_in_use = self.app_state.keys_in_use.lock().await;
165163
keys_in_use.remove(&self.key_id);
166164
}
167165

168-
let mut conn = match self.app_state.pool.get() {
169-
Ok(conn) => conn,
170-
Err(_err) => {
171-
log::error!(
172-
"Failed to release connection '{}' for charger '{}'",
173-
self.key_id,
174-
self.charger_id
175-
);
176-
return;
177-
}
178-
};
179-
180166
let meta = RemoteConnMeta {
181167
charger_id: self.charger_id,
182168
conn_no: self.conn_no,
@@ -226,21 +212,6 @@ impl WebClient {
226212
}
227213
}
228214

229-
match diesel::update(wg_keys)
230-
.filter(id.eq(self.key_id))
231-
.set(in_use.eq(false))
232-
.execute(&mut conn)
233-
{
234-
Ok(_) => (),
235-
Err(_err) => {
236-
log::error!(
237-
"Failed to release connection '{}' for charger '{}'",
238-
self.key_id,
239-
self.charger_id
240-
);
241-
}
242-
}
243-
244215
self.session.close(None).await.ok();
245216
}
246217
}
@@ -295,8 +266,7 @@ async fn start_ws(
295266
) -> Result<HttpResponse, actix_web::Error> {
296267
use db_connector::schema::wg_keys::dsl as wg_keys;
297268

298-
let key_uuid = uuid::Uuid::from_str(&key_id.key_id)
299-
.map_err(|_| Error::WgKeysDoNotExist)?;
269+
let key_uuid = uuid::Uuid::from_str(&key_id.key_id).map_err(|_| Error::WgKeysDoNotExist)?;
300270

301271
let mut keys_in_use = state.keys_in_use.lock().await;
302272
if keys_in_use.contains(&key_uuid) {
@@ -347,20 +317,6 @@ async fn start_ws(
347317

348318
if resp.status() == 101 {
349319
keys_in_use.insert(keys.id);
350-
351-
let mut conn = get_connection(&state)?;
352-
use db_connector::schema::wg_keys::dsl::*;
353-
web_block_unpacked(move || {
354-
if let Err(_err) = diesel::update(wg_keys)
355-
.filter(id.eq(&keys.id))
356-
.set(in_use.eq(true))
357-
.execute(&mut conn)
358-
{
359-
return Err(Error::InternalError);
360-
}
361-
Ok(())
362-
})
363-
.await?;
364320
}
365321
drop(keys_in_use);
366322

@@ -408,8 +364,18 @@ async fn start_ws(
408364

409365
#[cfg(test)]
410366
mod tests {
411-
// #[actix_web::test]
412-
// async fn test_connecting_ws() {
367+
use super::*;
368+
use uuid::Uuid;
413369

414-
// }
370+
#[test]
371+
fn test_validate_key_id_valid() {
372+
let valid_uuid = Uuid::new_v4().to_string();
373+
assert!(validate_key_id(&valid_uuid).is_ok());
374+
}
375+
376+
#[test]
377+
fn test_validate_key_id_invalid() {
378+
let invalid_uuid = "not-a-uuid";
379+
assert!(validate_key_id(invalid_uuid).is_err());
380+
}
415381
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-- This file should undo anything in `up.sql`
2+
3+
ALTER TABLE "wg_keys" ADD COLUMN "in_use" BOOLEAN NOT NULL DEFAULT false;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-- Your SQL goes here
2+
3+
ALTER TABLE "wg_keys" DROP COLUMN "in_use";

db_connector/src/models/wg_keys.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ pub struct WgKey {
1919
pub id: uuid::Uuid,
2020
pub user_id: uuid::Uuid,
2121
pub charger_id: uuid::Uuid,
22-
pub in_use: bool,
2322
pub charger_pub: String,
2423
pub web_private: Vec<u8>,
2524
pub psk: Vec<u8>,

db_connector/src/schema.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ diesel::table! {
9090
wg_keys (id) {
9191
id -> Uuid,
9292
user_id -> Uuid,
93-
in_use -> Bool,
9493
charger_pub -> Varchar,
9594
web_private -> Bytea,
9695
psk -> Bytea,

0 commit comments

Comments
 (0)