Compare commits

..

5 commits

Author SHA1 Message Date
dfcd9e8921
rm .keep 2023-09-04 03:48:14 -07:00
66489506ac
more level boilerplate 2023-09-04 03:41:32 -07:00
9ecb8b4ae8
fix auth 2023-09-04 03:18:40 -07:00
ef0e48e673
AUTH REWORK!!!! + add wip level 2023-09-04 03:16:11 -07:00
542d23d7c7
formatting changes 2023-09-03 16:21:24 -07:00
11 changed files with 136 additions and 20 deletions

7
Cargo.lock generated
View file

@ -68,6 +68,12 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "base64"
version = "0.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53"
[[package]]
name = "base64ct"
version = "1.6.0"
@ -406,6 +412,7 @@ dependencies = [
name = "gdps-server"
version = "0.0.0"
dependencies = [
"base64",
"diesel",
"dotenvy",
"maplit",

View file

@ -4,6 +4,7 @@ version = "0.0.0"
edition = "2021"
[dependencies]
base64 = "0.21.3"
diesel = { version = "=2.1.0", features = ["postgres"] }
dotenvy = "0.15.7"
maplit = "1.0.2"

View file

@ -34,6 +34,7 @@ _these features are implemented_
## todo
- green name users (fuck green names!!)
- move authorization logic to (./src/helpers/accounts.rs)[./src/helpers/accounts.rs]
- probably work on the code warnings we get hehe
- <small>green name users...</small> (add udid auth to auth function, use userName instead of accountID in uploading levels, and it goes on and on and on <small>and on...</small>)
- add level parsing
- maybe swap to timestamp type instead of `(TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.MS'))` (thats REALLY ugly!!)

View file

@ -1,4 +1,3 @@
use password_auth::verify_password;
use rocket::form::Form;
use rocket::http::Status;
use rocket::response::status;
@ -11,7 +10,10 @@ use crate::db;
#[derive(FromForm)]
pub struct FromLoginAccount {
userName: String,
password: String
password: Option<String>,
gjp: Option<String>,
gjp2: Option<String>,
}
#[post("/accounts/loginGJAccount.php", data = "<input>")]
@ -22,8 +24,14 @@ pub fn login_account(input: Form<FromLoginAccount>) -> status::Custom<&'static s
return status::Custom(Status::Ok, "-4")
}
if input.password.len() < 6 {
return status::Custom(Status::Ok, "-8")
// gjp2 checks dont matter, its hashed, gjp checks would break bc its base64, and why does this check exist if its just for logging in robtop this is useless it doesnt provide security we already did the security on the register account u fucking faggot im really bored of working on this but im also excited to see if it works deepwoken solos mid dash
match input.password.clone() {
Some(password_val) => {
if password_val.len() < 6 {
return status::Custom(Status::Ok, "-8")
}
},
None => {}
}
if input.userName.len() < 3 {
@ -34,21 +42,19 @@ pub fn login_account(input: Form<FromLoginAccount>) -> status::Custom<&'static s
{
use crate::schema::accounts::dsl::*;
let account_id_password_result = accounts
.select((id, password))
let query_result = accounts
.select(id)
.filter(username.eq(input.userName.clone()))
.get_result::<(i32, String)>(connection);
.get_result::<i32>(connection);
match account_id_password_result {
Ok(account_id_password) => {
let user_id = helpers::accounts::get_user_id_from_account_id(account_id_password.0);
match query_result {
Ok(account_id_val) => {
let user_id_val = helpers::accounts::get_user_id_from_account_id(account_id_val);
match verify_password(input.password.clone().as_bytes(), account_id_password.1.as_str()) {
Ok(_) => return status::Custom(Status::Ok,
Box::leak(format!("{},{}", account_id_password.0, user_id).into_boxed_str())
),
match helpers::accounts::auth(account_id_val, input.password.clone(), input.gjp.clone(), input.gjp2.clone()) {
Ok(_) => return status::Custom(Status::Ok, Box::leak(format!("{},{}", user_id_val, account_id_val).into_boxed_str())),
Err(_) => return status::Custom(Status::Ok, "-11")
};
}
},
Err(_) => return status::Custom(Status::Ok, "-1")
}

View file

@ -66,6 +66,7 @@ pub fn register_account(input: Form<FormRegisterAccount>) -> status::Custom<&'st
gjp2: generate_hash(helpers::encryption::get_gjp2(input.password.clone())),
email: input.email.clone()
};
inserted_account = diesel::insert_into(accounts)
.values(&new_account)
.get_result::<Account, >(connection)
@ -83,6 +84,7 @@ pub fn register_account(input: Form<FormRegisterAccount>) -> status::Custom<&'st
username: input.userName.clone(),
registered: 1
};
diesel::insert_into(users)
.values(&new_user)
.get_result::<User, >(connection)

View file

@ -0,0 +1 @@
pub mod upload_level;

View file

@ -0,0 +1,36 @@
use password_auth::verify_password;
use rocket::form::Form;
use rocket::http::Status;
use rocket::response::status;
use diesel::prelude::*;
use crate::helpers;
use crate::db;
#[derive(FromForm)]
pub struct FormUploadLevel {
accountID: i32,
password: Option<String>,
gjp: Option<String>,
gjp2: Option<String>,
}
#[post("/uploadGJLevel21.php", data = "<input>")]
pub fn upload_level(input: Form<FormUploadLevel>) -> status::Custom<&'static str> {
let connection = &mut db::establish_connection_pg();
// account verification
let (user_id_val, account_id_val): (i32, i32);
match helpers::accounts::auth(input.accountID.clone(), input.password.clone(), input.gjp.clone(), input.gjp2.clone()) {
Ok((user_id, account_id)) => {
user_id_val = user_id;
account_id_val = account_id;
},
Err(_) => return status::Custom(Status::Ok, "-1")
};
return status::Custom(Status::Ok, "1")
}

View file

@ -1,6 +1,60 @@
use diesel::prelude::*;
use password_auth::verify_password;
use crate::db;
use crate::{db, helpers};
// returns userid, accountid
pub enum AuthError {
WrongPassword,
AccountNotFound
}
pub fn auth(account_id: i32, password_val: Option<String>, gjp_val: Option<String>, gjp2_val: Option<String>) -> Result<(i32, i32), AuthError> {
use crate::schema::accounts::dsl::*;
let connection = &mut db::establish_connection_pg();
let query_result = accounts
.select((password, gjp2))
.filter(id.eq(account_id))
.get_result::<(String, String)>(connection);
match query_result {
Ok((
password_queried_val,
gjp2_queried_val
)) => {
match password_val {
Some(password_val) => {
match verify_password(password_val, &password_queried_val) {
Ok(_) => return Ok((get_user_id_from_account_id(account_id), account_id)),
Err(_) => return Err(AuthError::WrongPassword)
}
},
None => match gjp_val {
Some(gjp_val) => {
match verify_password(helpers::encryption::decode_gjp(gjp_val), &password_queried_val) {
Ok(_) => return Ok((get_user_id_from_account_id(account_id), account_id)),
Err(_) => return Err(AuthError::WrongPassword)
}
},
None => match gjp2_val {
Some(gjp2_val) => {
match verify_password(gjp2_val, &gjp2_queried_val) {
Ok(_) => return Ok((get_user_id_from_account_id(account_id), account_id)),
Err(_) => return Err(AuthError::WrongPassword)
}
},
None => {
return Err(AuthError::WrongPassword)
}
}
}
}
},
Err(_) => return Err(AuthError::AccountNotFound)
}
}
pub fn get_user_id_from_account_id(ext_id: i32) -> i32 {
use crate::schema::users::dsl::*;

View file

@ -1,7 +1,7 @@
use sha::sha1::Sha1;
use sha::utils::{Digest, DigestExt};
use password_auth::generate_hash;
use base64::{Engine as _, engine::general_purpose};
pub fn cyclic_xor(data: &[u8], key: &[u8]) -> Vec<u8> {
data.iter()
@ -21,4 +21,10 @@ pub fn cyclic_xor_string(string: &str, key: &str) -> String {
pub fn get_gjp2(password: String) -> String {
return Sha1::default().digest(String::from(password + "mI29fmAnxgTs").as_bytes()).to_hex();
}
pub fn decode_gjp(gjp: String) -> String {
let base64_decoded = String::from_utf8(general_purpose::STANDARD.decode(gjp).expect("couldn't decode base64")).expect("invalid UTF-8 sequence (how)");
let xor_decoded = cyclic_xor_string(&base64_decoded, "37526");
return xor_decoded
}

View file

@ -32,6 +32,8 @@ fn rocket() -> _ {
endpoints::accounts::login_account::login_account,
endpoints::accounts::register_account::register_account,
endpoints::users::get_users::get_users
endpoints::users::get_users::get_users,
endpoints::levels::upload_level::upload_level
])
}