account management thingy
BIN
public/assets/icons/gd/coin.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
public/assets/icons/gd/demon.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
public/assets/icons/gd/diamond.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
public/assets/icons/gd/silvercoin.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
public/assets/icons/gd/star.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 478 B After Width: | Height: | Size: 3 KiB |
106
public/style.css
|
@ -54,6 +54,10 @@ a {
|
|||
color: #a6e3a1;
|
||||
}
|
||||
|
||||
.dim {
|
||||
color: #a6adc8;
|
||||
}
|
||||
|
||||
.fancy-button {
|
||||
outline: 0;
|
||||
border: none;
|
||||
|
@ -67,4 +71,106 @@ a {
|
|||
cursor: pointer;
|
||||
|
||||
transition: 0.1s background-color;
|
||||
}
|
||||
|
||||
.fancy-button:hover {
|
||||
background-color: #bad4fc;
|
||||
}
|
||||
|
||||
.inline-post {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.inline-post-button {
|
||||
display: inline;
|
||||
background: none;
|
||||
outline: none;
|
||||
border: none;
|
||||
color: inherit;
|
||||
font-size: inherit;
|
||||
font-weight: inherit;
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.greeting ::selection {
|
||||
background-color: #11111b;
|
||||
color: #cdd6f4;
|
||||
}
|
||||
|
||||
.greeting {
|
||||
background-color: #89b4fa;
|
||||
color: #11111b;
|
||||
border-radius: 1.5em;
|
||||
padding: 1em;
|
||||
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.greeting-l {
|
||||
flex: 0 0 auto;
|
||||
max-width: 100%;
|
||||
width: auto;
|
||||
height: 100%;
|
||||
max-height: 3rem;
|
||||
object-fit: contain;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.greeting-r {
|
||||
flex: 1 1 0px;
|
||||
min-width: 0;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.greeting-top {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.greeting-top-left {
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
|
||||
.greeting-stats {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: stretch;
|
||||
gap: 0.5ex;
|
||||
}
|
||||
|
||||
.greeting-stats img {
|
||||
width: auto;
|
||||
height: 1em;
|
||||
}
|
||||
|
||||
.greeting a {
|
||||
color: #11111b;
|
||||
}
|
||||
|
||||
|
||||
.header {
|
||||
height: 96px;
|
||||
max-width: 600px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.header>.greeting {
|
||||
flex: 1 1 0px;
|
||||
}
|
||||
|
||||
.favicon {
|
||||
margin: auto;
|
||||
display: block;
|
||||
}
|
|
@ -39,4 +39,6 @@ i've run out of ideas.
|
|||
- better song support
|
||||
- authentication caching (ip? redis?)
|
||||
- use log instead of println
|
||||
- make a proper rank system (reuploading, uploading music, rating, etc.)
|
||||
- make a proper rank system (reuploading, uploading music, rating, etc.)
|
||||
- user icons in the account management + settings (gdicon.oat.zone? selfhost?)
|
||||
- account settings page
|
|
@ -58,7 +58,9 @@ fn rocket() -> _ {
|
|||
template_endpoints::login::post_login,
|
||||
template_endpoints::login::get_login,
|
||||
|
||||
template_endpoints::logout::logout,
|
||||
template_endpoints::account_management::account_management,
|
||||
|
||||
template_endpoints::logout::logout
|
||||
])
|
||||
// assets
|
||||
.mount("/", routes![
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
pub mod account_management;
|
||||
pub mod index;
|
||||
pub mod login;
|
||||
pub mod logout;
|
||||
|
|
37
src/template_endpoints/account_management.rs
Normal file
|
@ -0,0 +1,37 @@
|
|||
use rocket::response::Redirect;
|
||||
|
||||
use rocket_dyn_templates::{Template, context};
|
||||
|
||||
use rocket::http::CookieJar;
|
||||
|
||||
use diesel::prelude::*;
|
||||
|
||||
use crate::db;
|
||||
|
||||
#[get("/accounts")]
|
||||
pub fn account_management(cookies: &CookieJar<'_>) -> Result<Template, Redirect> {
|
||||
let connection = &mut db::establish_connection_pg();
|
||||
|
||||
let (logged_in, username_val, _account_id_val, user_id_val) = crate::helpers::templates::auth!(cookies);
|
||||
|
||||
if logged_in {
|
||||
use crate::schema::users::dsl::*;
|
||||
use crate::models::User;
|
||||
|
||||
let result = users
|
||||
.filter(id.eq(user_id_val.expect("user_id not found")))
|
||||
.get_result::<User, >(connection)
|
||||
.expect("couldnt find user with user id from account");
|
||||
|
||||
return Ok(Template::render("account_management", context! {
|
||||
username: username_val.expect("username not found"),
|
||||
stars: result.stars,
|
||||
diamonds: result.diamonds,
|
||||
coins: result.coins,
|
||||
user_coins: result.user_coins,
|
||||
demons: result.demons
|
||||
}));
|
||||
} else {
|
||||
return Err(Redirect::to("/login"));
|
||||
}
|
||||
}
|
|
@ -7,7 +7,7 @@ pub fn index() -> Template {
|
|||
let silly_strings: Vec<&str> = vec![
|
||||
"the trianges consume",
|
||||
"geomtry das",
|
||||
"now with no RCE!",
|
||||
"now with no ACE!",
|
||||
"the best gdps",
|
||||
"better than topala",
|
||||
"better than robtop",
|
||||
|
@ -17,7 +17,21 @@ pub fn index() -> Template {
|
|||
"kagepro",
|
||||
"wowaka is peak music",
|
||||
"you have been warned: dyno jun",
|
||||
"listen to jin"
|
||||
"listen to jin",
|
||||
"GIVEUP!GIVEUP!GIVEUP!GIVEUP!GIVEUP!GIVEUP!LOVE!LOVE!GIVEUP!GIVEUP!GIVEUP!GIVEUP!GIVEUP!GIVEUP!",
|
||||
"cross site scripting is a myth",
|
||||
"VITAL STATE: Deceased - abducted by Pikmin",
|
||||
"geometry dash for the 3ds",
|
||||
"trans rights",
|
||||
"how many maggots eat burger?",
|
||||
"who would win: the rust borrow checker or rotting flesh",
|
||||
"your system has run out of application memory",
|
||||
"unsafe { std::ptr::null_mut::<i32>().write(42) }",
|
||||
"-1",
|
||||
"[REDACTED]",
|
||||
"chrome jop jop?",
|
||||
"pikmin 4",
|
||||
"italian apk downloader"
|
||||
];
|
||||
|
||||
let mut rng = rand::thread_rng();
|
||||
|
|
|
@ -20,7 +20,7 @@ pub struct FormLogin {
|
|||
}
|
||||
|
||||
#[post("/login", data = "<input>")]
|
||||
pub fn post_login(jar: &CookieJar<'_>, input: Form<FormLogin>) -> Template {
|
||||
pub fn post_login(cookies: &CookieJar<'_>, input: Form<FormLogin>) -> Template {
|
||||
let connection = &mut db::establish_connection_pg();
|
||||
|
||||
use crate::schema::accounts::dsl::*;
|
||||
|
@ -34,15 +34,15 @@ pub fn post_login(jar: &CookieJar<'_>, input: Form<FormLogin>) -> Template {
|
|||
Ok(account_id_username_val) => {
|
||||
match helpers::accounts::auth(account_id_username_val.0, Some(input.password.clone()), None, None) {
|
||||
Ok(account_id_user_id_val) => {
|
||||
jar.add_private(Cookie::build(
|
||||
cookies.add_private(Cookie::build(
|
||||
"blackmail_data",
|
||||
format!("{}:{}:{}", account_id_username_val.1, account_id_user_id_val.0, account_id_user_id_val.1))
|
||||
.path("/")
|
||||
// should probably make this true when we get into production
|
||||
.secure(false)
|
||||
.http_only(true)
|
||||
.max_age(Duration::days(365))
|
||||
.finish());
|
||||
.path("/")
|
||||
// should probably make this true when we get into production
|
||||
.secure(false)
|
||||
.http_only(true)
|
||||
.max_age(Duration::days(365))
|
||||
.finish());
|
||||
|
||||
return Template::render("login", context! {
|
||||
success: "Successfully logged in"
|
||||
|
|
|
@ -3,9 +3,7 @@ use rocket::response::Redirect;
|
|||
|
||||
#[post("/accounts/logout")]
|
||||
pub fn logout(jar: &CookieJar<'_>) -> Redirect {
|
||||
jar.remove_private(Cookie::named("username"));
|
||||
jar.remove_private(Cookie::named("account_id"));
|
||||
jar.remove_private(Cookie::named("user_id"));
|
||||
jar.remove_private(Cookie::named("blackmail_data"));
|
||||
|
||||
Redirect::to("/")
|
||||
}
|
23
templates/account_header.html.hbs
Normal file
|
@ -0,0 +1,23 @@
|
|||
<div class="header">
|
||||
<div class="greeting">
|
||||
<img src="/assets/icons/gd/star.png" title="{{ username }}" class="greeting-l" height="100%" width="auto">
|
||||
<div class="greeting-r">
|
||||
<div class="greeting-top">
|
||||
<div class="greeting-top-left">
|
||||
hai, <b>{{ username }}</b>!
|
||||
</div>
|
||||
<div class="greeting-stats">
|
||||
{{ stars }} <img src="/assets/icons/gd/star.png"> {{ diamonds }} <img src="/assets/icons/gd/diamond.png"> {{ coins }} <img src="/assets/icons/gd/coin.png"> {{ user_coins }} <img src="/assets/icons/gd/silvercoin.png"> {{ demons }} <img src="/assets/icons/gd/demon.png">
|
||||
</div>
|
||||
</div>
|
||||
<div class="greeting-bottom">
|
||||
<a href="/accounts/settings">Settings</a> ·
|
||||
<form action="/accounts/logout" method="post" class="inline-post">
|
||||
<button type="submit" class="inline-post-button">
|
||||
Log out
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
49
templates/account_management.html.hbs
Normal file
|
@ -0,0 +1,49 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/png" href="/favicon.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link rel="stylesheet" href="/style.css" />
|
||||
<title>Home</title>
|
||||
</head>
|
||||
|
||||
<body style="display: flex; align-items: center; gap: 1.5em; flex-direction: column">
|
||||
<h1 style="display: flex; align-items: center; gap: 1em">
|
||||
<a href="/"><img src="/favicon.png" width="64" height="auto"></a>
|
||||
Account Management
|
||||
</h1>
|
||||
<div class="header">
|
||||
<div class="greeting">
|
||||
<img src="/assets/icons/gd/demon.png" title="{{ username }}" class="greeting-l">
|
||||
<div class="greeting-r">
|
||||
<div class="greeting-top">
|
||||
<div class="greeting-top-left">
|
||||
hai, <b>{{ username }}</b>!
|
||||
</div>
|
||||
<div class="greeting-stats">
|
||||
{{ stars }} <img src="/assets/icons/gd/star.png"> {{ diamonds }} <img src="/assets/icons/gd/diamond.png"> {{ coins }} <img src="/assets/icons/gd/coin.png"> {{ user_coins }} <img src="/assets/icons/gd/silvercoin.png"> {{ demons }} <img src="/assets/icons/gd/demon.png">
|
||||
</div>
|
||||
</div>
|
||||
<div class="greeting-bottom">
|
||||
<a href="/accounts/settings">Settings</a> ·
|
||||
<form action="/accounts/logout" method="post" class="inline-post">
|
||||
<button type="submit" class="inline-post-button">
|
||||
Log out
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="block">
|
||||
lorem ipsum sur dolor amet or something. i'll put stuff here later LOL
|
||||
<br><br>
|
||||
anyway how has ur day been
|
||||
<br><br>
|
||||
the demon should be your user icon haha, ill get 2 that latr :3 (gonna be next update i think)
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
<body style="display: flex; align-items: center; gap: 1.5em; flex-direction: column">
|
||||
<h1 style="display: flex; align-items: center; gap: 1em">
|
||||
<img src="/favicon.png" width="64" height="auto">
|
||||
<a href="/"><img src="/favicon.png" width="64" height="auto"></a>
|
||||
gdps-server
|
||||
</h1>
|
||||
<div class="block">
|
||||
|
@ -24,10 +24,11 @@
|
|||
<el>
|
||||
<li>The <a href="https://git.reidlab.online/reidlab/gdps-server">Git repository</a></li>
|
||||
<li><a href="/tools/reupload">Level reuploading</a></li>
|
||||
<li><a href="/accounts">Account stuff</a></li>
|
||||
</el>
|
||||
</p>
|
||||
</div>
|
||||
<div class="dim">
|
||||
<div style="max-width: 400px; font-style: italic; text-align: center" class="dim">
|
||||
{{ silly_string }}
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
|
||||
<body>
|
||||
<form method="post">
|
||||
<img src="/favicon.png" width="64" height="auto">
|
||||
<a href="/"><img src="/favicon.png" width="64" height="auto"></a>
|
||||
<br>
|
||||
<label for="username">Username</label>
|
||||
<input type="text" id="username" name="username" minlength="3" maxlength="20" required />
|
||||
|
|