Skip to content

Commit 0043d1e

Browse files
authored
Merge pull request #36 from piotrpdev/OKO-109-Guest-Accounts
2 parents 1e9a539 + 3b6453c commit 0043d1e

File tree

6 files changed

+54
-12
lines changed

6 files changed

+54
-12
lines changed

backend/fixtures/camera_permissions.sql

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@ INSERT INTO camera_permissions (permission_id, camera_id, user_id, can_view, can
44
(3, 1, 2, true, true),
55
(4, 2, 2, true, true),
66
(5, 1, 3, true, false),
7-
(6, 2, 3, false, false);
7+
(6, 2, 3, false, false),
8+
(7, 1, 4, false, false),
9+
(8, 2, 4, false, false);

backend/fixtures/users.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
INSERT INTO users (user_id, username, password_hash, created_at) VALUES
22
(1, 'admin', '$argon2id$v=19$m=19456,t=2,p=1$VE0e3g7DalWHgDwou3nuRA$uC6TER156UQpk0lNQ5+jHM0l5poVjPA1he/Tyn9J4Zw', '2024-10-21 17:01:23'),
33
(2, 'piotrpdev', '$argon2id$v=19$m=19456,t=2,p=1$VE0e3g7DalWHgDwou3nuRA$uC6TER156UQpk0lNQ5+jHM0l5poVjPA1he/Tyn9J4Zw', '2024-10-21 17:02:18'),
4-
(3, 'joedaly', '$argon2id$v=19$m=19456,t=2,p=1$VE0e3g7DalWHgDwou3nuRA$uC6TER156UQpk0lNQ5+jHM0l5poVjPA1he/Tyn9J4Zw', '2024-10-21 17:12:32');
4+
(3, 'joedaly', '$argon2id$v=19$m=19456,t=2,p=1$VE0e3g7DalWHgDwou3nuRA$uC6TER156UQpk0lNQ5+jHM0l5poVjPA1he/Tyn9J4Zw', '2024-10-21 17:12:32'),
5+
(4, 'guest', '$argon2id$v=19$m=19456,t=2,p=1$VE0e3g7DalWHgDwou3nuRA$uC6TER156UQpk0lNQ5+jHM0l5poVjPA1he/Tyn9J4Zw', '2024-10-21 17:15:45');

backend/src/db/camera_permission.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ mod tests {
148148

149149
camera_permission.create_using_self(&pool).await?;
150150

151-
assert_eq!(camera_permission.permission_id, 7);
151+
assert_eq!(camera_permission.permission_id, 9);
152152

153153
let returned_permission =
154154
CameraPermission::get_using_id(&pool, camera_permission.permission_id).await?;
@@ -248,7 +248,7 @@ mod tests {
248248
let camera_id = 1;
249249

250250
let returned_permissions = CameraPermission::list_for_camera(&pool, camera_id).await?;
251-
assert_eq!(returned_permissions.len(), 3);
251+
assert_eq!(returned_permissions.len(), 4);
252252

253253
let permission_ids: Vec<i64> = returned_permissions
254254
.iter()
@@ -258,6 +258,7 @@ mod tests {
258258
assert!(permission_ids.contains(&1));
259259
assert!(permission_ids.contains(&3));
260260
assert!(permission_ids.contains(&5));
261+
assert!(permission_ids.contains(&7));
261262

262263
Ok(())
263264
}
@@ -271,7 +272,7 @@ mod tests {
271272

272273
let returned_permissions =
273274
CameraPermission::list_for_camera_with_username(&pool, camera_id).await?;
274-
assert_eq!(returned_permissions.len(), 3);
275+
assert_eq!(returned_permissions.len(), 4);
275276

276277
let permission_ids: Vec<i64> = returned_permissions
277278
.iter()
@@ -281,6 +282,7 @@ mod tests {
281282
assert!(permission_ids.contains(&1));
282283
assert!(permission_ids.contains(&3));
283284
assert!(permission_ids.contains(&5));
285+
assert!(permission_ids.contains(&7));
284286

285287
let usernames: Vec<&str> = returned_permissions
286288
.iter()
@@ -290,6 +292,7 @@ mod tests {
290292
assert!(usernames.contains(&"piotrpdev"));
291293
assert!(usernames.contains(&"joedaly"));
292294
assert!(usernames.contains(&"admin"));
295+
assert!(usernames.contains(&"guest"));
293296

294297
Ok(())
295298
}

backend/src/db/user.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ mod tests {
179179

180180
user.create_using_self(&pool).await?;
181181

182-
assert_eq!(user.user_id, 4);
182+
assert_eq!(user.user_id, 5);
183183

184-
let returned_user = User::get_using_id(&pool, 4).await?;
184+
let returned_user = User::get_using_id(&pool, 5).await?;
185185

186186
assert_eq!(returned_user.username, user.username);
187187
assert_eq!(returned_user.password_hash, user.password_hash);
@@ -241,10 +241,10 @@ mod tests {
241241

242242
#[sqlx::test(fixtures(path = "../../fixtures", scripts("users")))]
243243
async fn get_all(pool: SqlitePool) -> Result<(), Box<dyn std::error::Error>> {
244-
let usernames = ["admin", "piotrpdev", "joedaly"];
244+
let usernames = ["admin", "piotrpdev", "joedaly", "guest"];
245245
let returned_users = User::get_all(&pool).await?;
246246

247-
assert_eq!(returned_users.len(), 3);
247+
assert_eq!(returned_users.len(), 4);
248248

249249
assert!(returned_users
250250
.iter()

backend/src/web/app.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,13 @@ use super::{ImageContainer, MdnsChannelMessage};
5858

5959
// TODO: Maybe use `std::future::pending::<()>();` instead of sleeping forever
6060

61+
// TODO: Change default admin and guest hashes, remember to search and update where they're hardcoded
6162
const SQLITE_URL: &str = "sqlite://data.db";
6263
const VIDEO_PATH: &str = "./videos/";
6364
const DEFAULT_ADMIN_USERNAME: &str = "admin";
6465
const DEFAULT_ADMIN_PASS_HASH: &str = "$argon2id$v=19$m=19456,t=2,p=1$VE0e3g7DalWHgDwou3nuRA$uC6TER156UQpk0lNQ5+jHM0l5poVjPA1he/Tyn9J4Zw";
66+
const DEFAULT_GUEST_USERNAME: &str = "guest";
67+
const DEFAULT_GUEST_PASS_HASH: &str = "$argon2id$v=19$m=19456,t=2,p=1$VE0e3g7DalWHgDwou3nuRA$uC6TER156UQpk0lNQ5+jHM0l5poVjPA1he/Tyn9J4Zw";
6568
const EXPIRED_SESSION_DELETION_INTERVAL: tokio::time::Duration =
6669
tokio::time::Duration::from_secs(60);
6770
const SESSION_DURATION: Duration = Duration::days(1);
@@ -142,6 +145,21 @@ impl App {
142145
admin.create_using_self(&self.db).await?;
143146
}
144147

148+
// ? Maybe make this optional just in case
149+
let guest_exists = User::get_using_username(&self.db, DEFAULT_GUEST_USERNAME)
150+
.await
151+
.is_ok();
152+
if !guest_exists {
153+
let mut guest = User {
154+
user_id: User::DEFAULT.user_id,
155+
username: "guest".to_string(),
156+
password_hash: DEFAULT_GUEST_PASS_HASH.to_owned(),
157+
created_at: User::DEFAULT.created_at(),
158+
};
159+
160+
guest.create_using_self(&self.db).await?;
161+
}
162+
145163
// Session layer.
146164
//
147165
// This uses `tower-sessions` to establish a layer that will provide the session

frontend/src/routes/Login.svelte

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@
77
import { replace } from "svelte-spa-router";
88
import { user } from "../lib/stores/userStore";
99
10-
let username = "admin";
11-
let password = "hunter42";
10+
const DEFAULT_ADMIN_USERNAME = "admin";
11+
const DEFAULT_ADMIN_PASSWORD = "hunter42";
12+
const DEFAULT_GUEST_USERNAME = "guest";
13+
const DEFAULT_GUEST_PASSWORD = "hunter42";
14+
15+
let username = import.meta.env.DEV ? DEFAULT_ADMIN_USERNAME : "";
16+
let password = import.meta.env.DEV ? DEFAULT_ADMIN_PASSWORD : "";
1217
1318
async function handleSubmit() {
1419
const response = await fetch("/api/login", {
@@ -76,8 +81,21 @@
7681
/>
7782
</div>
7883
</Card.Content>
79-
<Card.Footer>
84+
<Card.Footer class="flex-col gap-4">
8085
<Button id="login" class="w-full" type="submit">Sign in</Button>
86+
<Button
87+
id="login-guest"
88+
variant="outline"
89+
class="w-full"
90+
type="button"
91+
on:click={() => {
92+
username = DEFAULT_GUEST_USERNAME;
93+
password = DEFAULT_GUEST_PASSWORD;
94+
handleSubmit();
95+
}}
96+
>
97+
Sign in as Guest
98+
</Button>
8199
</Card.Footer>
82100
</form>
83101
</Card.Root>

0 commit comments

Comments
 (0)