[FIX] Websocket & webserver is now actix, because that should be better
than hyper & axum, i guess we'll see in the long run :}, ToDo: IF THIS WORKS: implement on the iota
This commit is contained in:
parent
5cfdadd291
commit
cb7579d86d
7 changed files with 1432 additions and 961 deletions
|
|
@ -1,27 +1,21 @@
|
|||
use crate::data::communication::{CommunicationType, CommunicationValue, DataTypes};
|
||||
use crate::get_public_key;
|
||||
use crate::server::omikron_manager::get_random_omikron;
|
||||
use crate::sql::sql;
|
||||
use crate::sql::user_online_tracker::get_iota_primary_omikron_connection;
|
||||
use crate::util::file_util::load_file_vec;
|
||||
use crate::util::file_util::load_file;
|
||||
use crate::{get_public_key, log};
|
||||
use crate::{
|
||||
sql::sql::{get_by_user_id, get_omikron_by_id},
|
||||
util::crypto_helper::public_key_to_base64,
|
||||
};
|
||||
use axum::http::HeaderValue;
|
||||
use actix_web::HttpResponse;
|
||||
use actix_web::body::BoxBody;
|
||||
use actix_web::http::StatusCode;
|
||||
use base64::Engine as _;
|
||||
use http_body_util::Full;
|
||||
use hyper::body::Bytes;
|
||||
use hyper::header::{CONTENT_DISPOSITION, CONTENT_LENGTH, CONTENT_TYPE};
|
||||
use hyper::{HeaderMap, Response as HttpResponse, StatusCode};
|
||||
use json::JsonValue;
|
||||
use json::number::Number;
|
||||
|
||||
pub async fn handle(
|
||||
path: &str,
|
||||
_headers: HeaderMap<HeaderValue>,
|
||||
body_string: Option<String>,
|
||||
) -> HttpResponse<Full<Bytes>> {
|
||||
pub async fn handle(path: &str, body_string: Option<String>) -> HttpResponse {
|
||||
let path_parts: Vec<&str> = path.split("/").filter(|s| !s.is_empty()).collect();
|
||||
|
||||
let _body: Option<JsonValue> = if body_string.is_some() {
|
||||
|
|
@ -33,258 +27,189 @@ pub async fn handle(
|
|||
} else {
|
||||
None
|
||||
};
|
||||
let (status, body_text) = if path_parts.len() >= 2 {
|
||||
match path_parts[1] {
|
||||
"download" => {
|
||||
if path_parts.len() == 3 && path_parts[2] == "iota_frontend" {
|
||||
let file: Bytes = load_file_vec("downloads", "iota_frontend.zip")
|
||||
.unwrap()
|
||||
.into();
|
||||
let len = file.len();
|
||||
let body = Full::new(file);
|
||||
|
||||
let response = HttpResponse::builder()
|
||||
.status(StatusCode::OK)
|
||||
.header(CONTENT_TYPE, "application/zip")
|
||||
.header(
|
||||
CONTENT_DISPOSITION,
|
||||
"attachment; filename=\"iota_frontend.zip\"",
|
||||
)
|
||||
.header(CONTENT_LENGTH, len)
|
||||
.body(body)
|
||||
.unwrap();
|
||||
return response;
|
||||
} else {
|
||||
bad_request()
|
||||
}
|
||||
}
|
||||
"get" => match path_parts[2] {
|
||||
// api/get/omikron -> any omikron
|
||||
// api/get/omikron/<id> -> omikron for id (user / iota / omikron)
|
||||
"omikron" => {
|
||||
if path_parts.len() == 3 {
|
||||
if let Ok(omikron_conn) = get_random_omikron().await {
|
||||
if let Ok((public_key, ip_address)) =
|
||||
sql::get_omikron_by_id(omikron_conn.get_omikron_id().await).await
|
||||
{
|
||||
(
|
||||
StatusCode::OK,
|
||||
format!(
|
||||
"{{\"id\": {}, \"public_key\": \"{}\", \"ip_address\": \"{}\"}}",
|
||||
omikron_conn.get_omikron_id().await,
|
||||
public_key,
|
||||
ip_address
|
||||
),
|
||||
)
|
||||
} else {
|
||||
(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
"selected an invalid omikron".to_string(),
|
||||
)
|
||||
}
|
||||
} else {
|
||||
(
|
||||
StatusCode::NOT_FOUND,
|
||||
"couldn't find online omikron".to_string(),
|
||||
)
|
||||
}
|
||||
} else if path_parts.len() == 4 {
|
||||
let id = path_parts[3].parse::<i64>().unwrap_or(0);
|
||||
if id == 0 {
|
||||
not_found()
|
||||
} else if let Ok((public_key, ip_address)) = get_omikron_by_id(id).await {
|
||||
(
|
||||
StatusCode::OK,
|
||||
format!(
|
||||
"{{\"id\": {}, \"public_key\": \"{}\", \"ip_address\": \"{}\"}}",
|
||||
id, public_key, ip_address
|
||||
),
|
||||
)
|
||||
} else if let Some(omikron_id) = get_iota_primary_omikron_connection(id) {
|
||||
if let Ok((public_key, ip_address)) =
|
||||
get_omikron_by_id(omikron_id).await
|
||||
{
|
||||
(
|
||||
StatusCode::OK,
|
||||
format!(
|
||||
"{{\"id\": {}, \"public_key\": \"{}\", \"ip_address\": \"{}\"}}",
|
||||
omikron_id, public_key, ip_address
|
||||
),
|
||||
)
|
||||
} else {
|
||||
not_found()
|
||||
}
|
||||
} else if let Ok((_, iota_id, _, _, _, _, _, _, _, _, _, _)) =
|
||||
get_by_user_id(id).await
|
||||
{
|
||||
if let Some(omikron_id) = get_iota_primary_omikron_connection(iota_id) {
|
||||
if let Ok((public_key, ip_address)) =
|
||||
get_omikron_by_id(omikron_id).await
|
||||
{
|
||||
(
|
||||
StatusCode::OK,
|
||||
format!(
|
||||
"{{\"id\": {}, \"public_key\": \"{}\", \"ip_address\": \"{}\"}}",
|
||||
omikron_id, public_key, ip_address
|
||||
),
|
||||
)
|
||||
} else {
|
||||
not_found()
|
||||
}
|
||||
} else {
|
||||
not_found()
|
||||
}
|
||||
} else {
|
||||
not_found()
|
||||
}
|
||||
} else {
|
||||
bad_request()
|
||||
}
|
||||
}
|
||||
// get/id/<username>
|
||||
"id" => {
|
||||
if path_parts.len() != 4 {
|
||||
bad_request()
|
||||
} else {
|
||||
let username = path_parts[3];
|
||||
if username.is_empty() {
|
||||
not_found()
|
||||
} else {
|
||||
if let Ok((
|
||||
id,
|
||||
iota_id,
|
||||
username,
|
||||
_,
|
||||
_,
|
||||
_,
|
||||
_,
|
||||
sub_level,
|
||||
sub_end,
|
||||
public_key,
|
||||
_,
|
||||
_,
|
||||
)) = sql::get_by_username(username).await
|
||||
{
|
||||
let cv = CommunicationValue::new(CommunicationType::success)
|
||||
.add_data_str(DataTypes::username, username)
|
||||
.add_data_str(DataTypes::public_key, public_key)
|
||||
.add_data(
|
||||
DataTypes::user_id,
|
||||
JsonValue::Number(Number::from(id)),
|
||||
)
|
||||
.add_data(
|
||||
DataTypes::iota_id,
|
||||
JsonValue::Number(Number::from(iota_id)),
|
||||
)
|
||||
.add_data(
|
||||
DataTypes::sub_level,
|
||||
JsonValue::Number(Number::from(sub_level)),
|
||||
)
|
||||
.add_data(
|
||||
DataTypes::sub_end,
|
||||
JsonValue::Number(Number::from(sub_end)),
|
||||
);
|
||||
(StatusCode::OK, cv.to_json().to_string())
|
||||
} else {
|
||||
(
|
||||
StatusCode::OK,
|
||||
CommunicationValue::new(CommunicationType::error_not_found)
|
||||
.to_json()
|
||||
.to_string(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"public_key" => (StatusCode::OK, public_key_to_base64(&get_public_key())),
|
||||
"user" => {
|
||||
if path_parts.len() != 4 {
|
||||
bad_request()
|
||||
} else {
|
||||
let id = path_parts[3];
|
||||
let id: i64 = id.parse().unwrap_or(0);
|
||||
if id == 0 {
|
||||
bad_request()
|
||||
} else {
|
||||
if let Ok((
|
||||
id,
|
||||
iota_id,
|
||||
username,
|
||||
display,
|
||||
status,
|
||||
about,
|
||||
avatar,
|
||||
sub_level,
|
||||
sub_end,
|
||||
public_key,
|
||||
_,
|
||||
_,
|
||||
)) = sql::get_by_user_id(id).await
|
||||
{
|
||||
let mut cv = CommunicationValue::new(CommunicationType::success)
|
||||
.add_data_str(DataTypes::username, username)
|
||||
.add_data_str(DataTypes::public_key, public_key)
|
||||
.add_data(
|
||||
DataTypes::user_id,
|
||||
JsonValue::Number(Number::from(id)),
|
||||
)
|
||||
.add_data(
|
||||
DataTypes::iota_id,
|
||||
JsonValue::Number(Number::from(iota_id)),
|
||||
)
|
||||
.add_data(
|
||||
DataTypes::sub_level,
|
||||
JsonValue::Number(Number::from(sub_level)),
|
||||
)
|
||||
.add_data(
|
||||
DataTypes::sub_end,
|
||||
JsonValue::Number(Number::from(sub_end)),
|
||||
);
|
||||
if let Some(display) = display {
|
||||
cv = cv.add_data_str(DataTypes::display, display);
|
||||
}
|
||||
if let Some(status) = status {
|
||||
cv = cv.add_data_str(DataTypes::status, status);
|
||||
}
|
||||
if let Some(about) = about {
|
||||
cv = cv.add_data_str(DataTypes::about, about);
|
||||
}
|
||||
if let Some(avatar) = avatar {
|
||||
cv = cv.add_data_str(
|
||||
DataTypes::avatar,
|
||||
base64::engine::general_purpose::STANDARD.encode(avatar),
|
||||
);
|
||||
}
|
||||
(StatusCode::OK, cv.to_json().to_string())
|
||||
} else {
|
||||
(
|
||||
StatusCode::OK,
|
||||
CommunicationValue::new(CommunicationType::error_not_found)
|
||||
.to_json()
|
||||
.to_string(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
let id = path_parts[2];
|
||||
let id: i64 = id.parse().unwrap_or(0);
|
||||
if id == 0 {
|
||||
bad_request()
|
||||
} else {
|
||||
bad_request()
|
||||
}
|
||||
}
|
||||
},
|
||||
_ => not_found(),
|
||||
log!("Path parts: {:?}", path_parts);
|
||||
let (status, body_text) = match path_parts.as_slice() {
|
||||
["api", "download", "iota_frontend"] => {
|
||||
let file = load_file("downloads", "iota_frontend.zip");
|
||||
(StatusCode::OK, file)
|
||||
}
|
||||
} else {
|
||||
not_found()
|
||||
["api", "get", "omikron"] => {
|
||||
if let Ok(omikron_conn) = get_random_omikron().await {
|
||||
if let Ok((public_key, ip_address)) =
|
||||
sql::get_omikron_by_id(omikron_conn.get_omikron_id().await).await
|
||||
{
|
||||
(
|
||||
StatusCode::OK,
|
||||
format!(
|
||||
"{{\"id\": {}, \"public_key\": \"{}\", \"ip_address\": \"{}\"}}",
|
||||
omikron_conn.get_omikron_id().await,
|
||||
public_key,
|
||||
ip_address
|
||||
),
|
||||
)
|
||||
} else {
|
||||
(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
"selected an invalid omikron".to_string(),
|
||||
)
|
||||
}
|
||||
} else {
|
||||
(
|
||||
StatusCode::NOT_FOUND,
|
||||
"couldn't find online omikron".to_string(),
|
||||
)
|
||||
}
|
||||
}
|
||||
["api", "get", "omikron", id] => {
|
||||
let id = id.parse::<i64>().unwrap_or(0);
|
||||
if id == 0 {
|
||||
not_found()
|
||||
} else if let Ok((public_key, ip_address)) = get_omikron_by_id(id).await {
|
||||
(
|
||||
StatusCode::OK,
|
||||
format!(
|
||||
"{{\"id\": {}, \"public_key\": \"{}\", \"ip_address\": \"{}\"}}",
|
||||
id, public_key, ip_address
|
||||
),
|
||||
)
|
||||
} else if let Some(omikron_id) = get_iota_primary_omikron_connection(id) {
|
||||
if let Ok((public_key, ip_address)) = get_omikron_by_id(omikron_id).await {
|
||||
(
|
||||
StatusCode::OK,
|
||||
format!(
|
||||
"{{\"id\": {}, \"public_key\": \"{}\", \"ip_address\": \"{}\"}}",
|
||||
omikron_id, public_key, ip_address
|
||||
),
|
||||
)
|
||||
} else {
|
||||
not_found()
|
||||
}
|
||||
} else if let Ok((_, iota_id, _, _, _, _, _, _, _, _, _, _)) = get_by_user_id(id).await
|
||||
{
|
||||
if let Some(omikron_id) = get_iota_primary_omikron_connection(iota_id) {
|
||||
if let Ok((public_key, ip_address)) = get_omikron_by_id(omikron_id).await {
|
||||
(
|
||||
StatusCode::OK,
|
||||
format!(
|
||||
"{{\"id\": {}, \"public_key\": \"{}\", \"ip_address\": \"{}\"}}",
|
||||
omikron_id, public_key, ip_address
|
||||
),
|
||||
)
|
||||
} else {
|
||||
not_found()
|
||||
}
|
||||
} else {
|
||||
not_found()
|
||||
}
|
||||
} else {
|
||||
not_found()
|
||||
}
|
||||
}
|
||||
["api", "get", "id", username] => {
|
||||
if username.is_empty() {
|
||||
not_found()
|
||||
} else if let Ok((
|
||||
id,
|
||||
iota_id,
|
||||
username,
|
||||
_,
|
||||
_,
|
||||
_,
|
||||
_,
|
||||
sub_level,
|
||||
sub_end,
|
||||
public_key,
|
||||
_,
|
||||
_,
|
||||
)) = sql::get_by_username(username).await
|
||||
{
|
||||
let cv = CommunicationValue::new(CommunicationType::success)
|
||||
.add_data_str(DataTypes::username, username)
|
||||
.add_data_str(DataTypes::public_key, public_key)
|
||||
.add_data(DataTypes::user_id, JsonValue::Number(Number::from(id)))
|
||||
.add_data(DataTypes::iota_id, JsonValue::Number(Number::from(iota_id)))
|
||||
.add_data(
|
||||
DataTypes::sub_level,
|
||||
JsonValue::Number(Number::from(sub_level)),
|
||||
)
|
||||
.add_data(DataTypes::sub_end, JsonValue::Number(Number::from(sub_end)));
|
||||
(StatusCode::OK, cv.to_json().to_string())
|
||||
} else {
|
||||
(
|
||||
StatusCode::OK,
|
||||
CommunicationValue::new(CommunicationType::error_not_found)
|
||||
.to_json()
|
||||
.to_string(),
|
||||
)
|
||||
}
|
||||
}
|
||||
["api", "get", "public_key"] => (StatusCode::OK, public_key_to_base64(&get_public_key())),
|
||||
["api", "get", "user", id] => {
|
||||
let id: i64 = id.parse().unwrap_or(0);
|
||||
if id == 0 {
|
||||
bad_request()
|
||||
} else if let Ok((
|
||||
id,
|
||||
iota_id,
|
||||
username,
|
||||
display,
|
||||
status,
|
||||
about,
|
||||
avatar,
|
||||
sub_level,
|
||||
sub_end,
|
||||
public_key,
|
||||
_,
|
||||
_,
|
||||
)) = sql::get_by_user_id(id).await
|
||||
{
|
||||
let mut cv = CommunicationValue::new(CommunicationType::success)
|
||||
.add_data_str(DataTypes::username, username)
|
||||
.add_data_str(DataTypes::public_key, public_key)
|
||||
.add_data(DataTypes::user_id, JsonValue::Number(Number::from(id)))
|
||||
.add_data(DataTypes::iota_id, JsonValue::Number(Number::from(iota_id)))
|
||||
.add_data(
|
||||
DataTypes::sub_level,
|
||||
JsonValue::Number(Number::from(sub_level)),
|
||||
)
|
||||
.add_data(DataTypes::sub_end, JsonValue::Number(Number::from(sub_end)));
|
||||
if let Some(display) = display {
|
||||
cv = cv.add_data_str(DataTypes::display, display);
|
||||
}
|
||||
if let Some(status) = status {
|
||||
cv = cv.add_data_str(DataTypes::status, status);
|
||||
}
|
||||
if let Some(about) = about {
|
||||
cv = cv.add_data_str(DataTypes::about, about);
|
||||
}
|
||||
if let Some(avatar) = avatar {
|
||||
cv = cv.add_data_str(
|
||||
DataTypes::avatar,
|
||||
base64::engine::general_purpose::STANDARD.encode(avatar),
|
||||
);
|
||||
}
|
||||
(StatusCode::OK, cv.to_json().to_string())
|
||||
} else {
|
||||
(
|
||||
StatusCode::OK,
|
||||
CommunicationValue::new(CommunicationType::error_not_found)
|
||||
.to_json()
|
||||
.to_string(),
|
||||
)
|
||||
}
|
||||
}
|
||||
_ => (
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
CommunicationValue::new(CommunicationType::error)
|
||||
.to_json()
|
||||
.to_string(),
|
||||
),
|
||||
};
|
||||
let body = Full::new(Bytes::from(body_text.to_string()));
|
||||
HttpResponse::builder().status(status).body(body).unwrap()
|
||||
let body_bytes = body_text.to_string().into_bytes();
|
||||
let body = BoxBody::new(body_bytes.clone());
|
||||
HttpResponse::new(status).set_body(body)
|
||||
}
|
||||
|
||||
pub fn bad_request() -> (StatusCode, String) {
|
||||
(StatusCode::BAD_REQUEST, "400 Bad Request".to_string())
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue