Add config.yml & Set AIRA_VERSION in build.rs

This commit is contained in:
Matéo Duparc 2021-05-18 18:46:23 +02:00
parent 275c2972df
commit 1b175b81e9
Signed by: hardcoresushi
GPG Key ID: 007F84120107191E
9 changed files with 78 additions and 38 deletions

12
Cargo.lock generated
View File

@ -389,13 +389,14 @@ dependencies = [
"tungstenite", "tungstenite",
"uuid", "uuid",
"webbrowser", "webbrowser",
"yaml-rust",
"zeroize", "zeroize",
] ]
[[package]] [[package]]
name = "async-psec" name = "async-psec"
version = "0.1.0" version = "0.1.0"
source = "git+https://forge.chapril.org/hardcoresushi/async-psec#272e7867e7a385b34d3d955aa3e5076e9833d3f1" source = "git+https://forge.chapril.org/hardcoresushi/async-psec#9d2713aea1e982d7c0f10a466268f623a87ec5d9"
dependencies = [ dependencies = [
"aes-gcm", "aes-gcm",
"async-trait", "async-trait",
@ -2732,6 +2733,15 @@ dependencies = [
"zeroize", "zeroize",
] ]
[[package]]
name = "yaml-rust"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
dependencies = [
"linked-hash-map",
]
[[package]] [[package]]
name = "zeroize" name = "zeroize"
version = "1.3.0" version = "1.3.0"

View File

@ -35,6 +35,8 @@ if-addrs = "0.6"
base64 = "0.13" base64 = "0.13"
scrypt = "0.7" scrypt = "0.7"
zeroize = "1.2" zeroize = "1.2"
yaml-rust = "0.4" #only in debug mode
[build-dependencies] [build-dependencies]
html-minifier = "3.0" html-minifier = "3.0"
yaml-rust = "0.4"

View File

@ -1,6 +1,7 @@
#[cfg(not(debug_assertions))]
use std::{env, fs::{File, read_to_string, create_dir}, path::Path, io::{Write, ErrorKind}}; use std::{env, fs::{File, read_to_string, create_dir}, path::Path, io::{Write, ErrorKind}};
#[allow(dead_code)] #[cfg(not(debug_assertions))]
fn minify_content(content: &str, language: &str) -> Option<String> { fn minify_content(content: &str, language: &str) -> Option<String> {
match language { match language {
"html" => Some(html_minifier::minify(content).unwrap()), "html" => Some(html_minifier::minify(content).unwrap()),
@ -10,8 +11,10 @@ fn minify_content(content: &str, language: &str) -> Option<String> {
} }
} }
#[allow(dead_code)] #[cfg(not(debug_assertions))]
fn minify_web_files() { fn generate_web_files() {
use yaml_rust::YamlLoader;
let out_dir = env::var("OUT_DIR").unwrap(); let out_dir = env::var("OUT_DIR").unwrap();
let out_dir = Path::new(&out_dir); let out_dir = Path::new(&out_dir);
let src_dir = Path::new("src/frontend"); let src_dir = Path::new("src/frontend");
@ -22,23 +25,35 @@ fn minify_web_files() {
} }
} }
let config = &YamlLoader::load_from_str(&read_to_string("config.yml").unwrap()).unwrap()[0];
let css_values = config["css"].as_hash().unwrap();
[ [
"login.html", "login.html",
"index.html", "index.html",
"index.css", "index.css",
"index.js", "index.js",
"commons/style.css", "commons/style.css",
"commons/script.js" "commons/script.js",
].iter().for_each(|file_name| { ].iter().for_each(|file_name| {
let file_name = Path::new(file_name); let path = Path::new(file_name);
let content = read_to_string(src_dir.join(file_name)).unwrap(); let extension = path.extension().unwrap().to_str().unwrap();
let minified_content = minify_content(&content, file_name.extension().unwrap().to_str().unwrap()).unwrap(); let mut content = read_to_string(src_dir.join(path)).unwrap();
let mut dst = File::create(out_dir.join(file_name)).unwrap(); if extension == "css" {
css_values.into_iter().for_each(|entry| {
content = content.replace(entry.0.as_str().unwrap(), entry.1.as_str().unwrap());
});
}
if file_name == &"index.html" {
content = content.replace("AIRA_VERSION", env!("CARGO_PKG_VERSION"));
}
let minified_content = minify_content(&content, extension).unwrap();
let mut dst = File::create(out_dir.join(path)).unwrap();
dst.write(minified_content.as_bytes()).unwrap(); dst.write(minified_content.as_bytes()).unwrap();
}); });
} }
fn main() { fn main() {
#[cfg(not(debug_assertions))] #[cfg(not(debug_assertions))]
minify_web_files(); generate_web_files();
} }

2
config.yml Normal file
View File

@ -0,0 +1,2 @@
css:
ACCENT_COLOR: "19a52c"

View File

@ -4,7 +4,7 @@
} }
:root { :root {
--accent: #19a52c; --accent: #ACCENT_COLOR;
--transparent: #00000000; --transparent: #00000000;
} }

View File

@ -57,7 +57,7 @@ input[type="file"] {
cursor: pointer; cursor: pointer;
} }
.file_picker::after { .file_picker::after {
content: url("/static/imgs/icons/attach/19a52c"); content: url("/static/imgs/icons/attach/ACCENT_COLOR");
width: 2em; width: 2em;
} }
.popup { .popup {
@ -126,7 +126,7 @@ input[type="file"] {
font-size: 0.9em; font-size: 0.9em;
} }
.popup h2.warning::before { .popup h2.warning::before {
content: url("/static/imgs/icons/warning/19a52c"); content: url("/static/imgs/icons/warning/ACCENT_COLOR");
width: 9%; width: 9%;
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
@ -272,7 +272,7 @@ label {
background-color: #333940; background-color: #333940;
} }
#left_panel ul li p::after { #left_panel ul li p::after {
content: url("/static/imgs/icons/warning/19a52c"); content: url("/static/imgs/icons/warning/ACCENT_COLOR");
display: inline-block; display: inline-block;
width: 1em; width: 1em;
margin-left: 5px; margin-left: 5px;
@ -282,7 +282,7 @@ label {
content: unset; content: unset;
} }
#left_panel ul li.is_verified p::after { #left_panel ul li.is_verified p::after {
content: url("/static/imgs/icons/verified/19a52c"); content: url("/static/imgs/icons/verified/ACCENT_COLOR");
} }
#left_panel ul li .not_seen_marker { #left_panel ul li .not_seen_marker {
width: 12px; width: 12px;
@ -316,7 +316,7 @@ label {
} }
#show_local_ips:hover::after { #show_local_ips:hover::after {
background-color: unset; background-color: unset;
content: url("/static/imgs/icons/info/19a52c"); content: url("/static/imgs/icons/info/ACCENT_COLOR");
} }
.popup ul { .popup ul {
list-style-type: unset; list-style-type: unset;
@ -341,7 +341,7 @@ label {
margin: 0; margin: 0;
} }
#chat_header p::after { #chat_header p::after {
content: url("/static/imgs/icons/warning/19a52c"); content: url("/static/imgs/icons/warning/ACCENT_COLOR");
display: inline-block; display: inline-block;
width: 1.2em; width: 1.2em;
vertical-align: middle; vertical-align: middle;
@ -351,7 +351,7 @@ label {
content: unset; content: unset;
} }
#chat_header.is_verified p::after { #chat_header.is_verified p::after {
content: url("/static/imgs/icons/verified/19a52c"); content: url("/static/imgs/icons/verified/ACCENT_COLOR");
} }
#chat_header.is_contact #delete_conversation::after { #chat_header.is_contact #delete_conversation::after {
content: url("/static/imgs/icons/delete_conversation"); content: url("/static/imgs/icons/delete_conversation");
@ -403,7 +403,7 @@ label {
#file_cancel::after { #file_cancel::after {
background-color: unset; background-color: unset;
width: 20px; width: 20px;
content: url("/static/imgs/icons/cancel/19a52c"); content: url("/static/imgs/icons/cancel/ACCENT_COLOR");
} }
#file_progress { #file_progress {
display: none; display: none;
@ -477,7 +477,7 @@ label {
color: var(--accent); color: var(--accent);
} }
#msg_log .file a::after { #msg_log .file a::after {
content: url("/static/imgs/icons/download/19a52c"); content: url("/static/imgs/icons/download/ACCENT_COLOR");
display: block; display: block;
width: 2em; width: 2em;
margin-left: 15px; margin-left: 15px;

View File

@ -1071,6 +1071,7 @@ function displayChatBottom(speed = undefined) {
function displayHistory(scrollToBottom = true) { function displayHistory(scrollToBottom = true) {
msg_log.style.display = "block"; msg_log.style.display = "block";
msg_log.innerHTML = ""; msg_log.innerHTML = "";
let session = sessionsData.get(currentSessionId);
let previousOutgoing = undefined; let previousOutgoing = undefined;
msgHistory.get(currentSessionId).forEach(entry => { msgHistory.get(currentSessionId).forEach(entry => {
let name = undefined; let name = undefined;
@ -1079,7 +1080,7 @@ function displayHistory(scrollToBottom = true) {
if (entry[0]) { //outgoing msg if (entry[0]) { //outgoing msg
name = identityName; name = identityName;
} else { } else {
name = sessionsData.get(currentSessionId).name; name = session.name;
} }
} }
if (entry[1]) { //is file if (entry[1]) { //is file
@ -1091,7 +1092,9 @@ function displayHistory(scrollToBottom = true) {
if (scrollToBottom) { if (scrollToBottom) {
msg_log.scrollTop = msg_log.scrollHeight; msg_log.scrollTop = msg_log.scrollHeight;
} }
if (msg_log.scrollHeight <= msg_log.clientHeight) { if (typeof session !== "undefined") {
if (msg_log.scrollHeight <= msg_log.clientHeight && session.isContact) {
socket.send("load_msgs "+currentSessionId); socket.send("load_msgs "+currentSessionId);
} }
} }
}

View File

@ -550,14 +550,14 @@ async fn handle_index(req: HttpRequest) -> HttpResponse {
if is_authenticated(&req) { if is_authenticated(&req) {
let global_vars_read = global_vars.read().unwrap(); let global_vars_read = global_vars.read().unwrap();
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
let html = fs::read_to_string("src/frontend/index.html").unwrap(); let html = fs::read_to_string("src/frontend/index.html").unwrap()
.replace("AIRA_VERSION", env!("CARGO_PKG_VERSION"));
#[cfg(not(debug_assertions))] #[cfg(not(debug_assertions))]
let html = include_str!(concat!(env!("OUT_DIR"), "/index.html")); let html = include_str!(concat!(env!("OUT_DIR"), "/index.html"));
let public_key = global_vars_read.session_manager.identity.read().unwrap().as_ref().unwrap().get_public_key(); let public_key = global_vars_read.session_manager.identity.read().unwrap().as_ref().unwrap().get_public_key();
let use_padding = global_vars_read.session_manager.identity.read().unwrap().as_ref().unwrap().use_padding.to_string(); let use_padding = global_vars_read.session_manager.identity.read().unwrap().as_ref().unwrap().use_padding.to_string();
HttpResponse::Ok().body( HttpResponse::Ok().body(
html html
.replace("AIRA_VERSION", env!("CARGO_PKG_VERSION"))
.replace("IDENTITY_FINGERPRINT", &crypto::generate_fingerprint(&public_key)) .replace("IDENTITY_FINGERPRINT", &crypto::generate_fingerprint(&public_key))
.replace("WEBSOCKET_PORT", &global_vars_read.websocket_port.to_string()) .replace("WEBSOCKET_PORT", &global_vars_read.websocket_port.to_string())
.replace("IS_IDENTITY_PROTECTED", &Identity::is_protected().unwrap().to_string()) .replace("IS_IDENTITY_PROTECTED", &Identity::is_protected().unwrap().to_string())
@ -570,6 +570,18 @@ async fn handle_index(req: HttpRequest) -> HttpResponse {
const JS_CONTENT_TYPE: &str = "text/javascript"; const JS_CONTENT_TYPE: &str = "text/javascript";
#[cfg(debug_assertions)]
fn replace_css(file_path: &str) -> String {
use yaml_rust::YamlLoader;
let mut content = fs::read_to_string(file_path).unwrap();
let config = &YamlLoader::load_from_str(&fs::read_to_string("config.yml").unwrap()).unwrap()[0];
let css_values = config["css"].as_hash().unwrap();
css_values.into_iter().for_each(|entry| {
content = content.replace(entry.0.as_str().unwrap(), entry.1.as_str().unwrap());
});
content
}
fn handle_static(req: HttpRequest) -> HttpResponse { fn handle_static(req: HttpRequest) -> HttpResponse {
let splits: Vec<&str> = req.path()[1..].split("/").collect(); let splits: Vec<&str> = req.path()[1..].split("/").collect();
if splits[0] == "static" { if splits[0] == "static" {
@ -584,7 +596,7 @@ fn handle_static(req: HttpRequest) -> HttpResponse {
} }
"index.css" => { "index.css" => {
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
return response_builder.body(fs::read_to_string("src/frontend/index.css").unwrap()); return response_builder.body(replace_css("src/frontend/index.css"));
#[cfg(not(debug_assertions))] #[cfg(not(debug_assertions))]
return response_builder.body(include_str!(concat!(env!("OUT_DIR"), "/index.css"))); return response_builder.body(include_str!(concat!(env!("OUT_DIR"), "/index.css")));
} }
@ -643,7 +655,7 @@ fn handle_static(req: HttpRequest) -> HttpResponse {
} }
"style.css" => { "style.css" => {
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
return response_builder.body(fs::read_to_string("src/frontend/commons/style.css").unwrap()); return response_builder.body(replace_css("src/frontend/commons/style.css"));
#[cfg(not(debug_assertions))] #[cfg(not(debug_assertions))]
return response_builder.body(include_str!(concat!(env!("OUT_DIR"), "/commons/style.css"))); return response_builder.body(include_str!(concat!(env!("OUT_DIR"), "/commons/style.css")));
} }

View File

@ -85,9 +85,9 @@ impl SessionManager {
pub fn store_msg(&self, session_id: &usize, outgoing: bool, buffer: Vec<u8>) { pub fn store_msg(&self, session_id: &usize, outgoing: bool, buffer: Vec<u8>) {
let mut msg_saved = false; let mut msg_saved = false;
if self.is_contact(session_id) { if let Some(contact) = self.loaded_contacts.read().unwrap().get(session_id) {
let mut offsets = self.last_loaded_msg_offsets.write().unwrap(); //locking mutex before modifying the DB to prevent race conditions let mut offsets = self.last_loaded_msg_offsets.write().unwrap(); //locking mutex before modifying the DB to prevent race conditions with load_msgs()
match self.identity.read().unwrap().as_ref().unwrap().store_msg(&self.loaded_contacts.read().unwrap().get(session_id).unwrap().uuid, outgoing, &buffer) { match self.identity.read().unwrap().as_ref().unwrap().store_msg(&contact.uuid, outgoing, &buffer) {
Ok(_) => { Ok(_) => {
*offsets.get_mut(session_id).unwrap() += 1; *offsets.get_mut(session_id).unwrap() += 1;
msg_saved = true; msg_saved = true;
@ -607,10 +607,6 @@ impl SessionManager {
result result
} }
pub fn is_contact(&self, session_id: &usize) -> bool {
self.loaded_contacts.read().unwrap().contains_key(session_id)
}
pub fn store_file(&self, session_id: &usize, data: &[u8]) -> Result<Uuid, rusqlite::Error> { pub fn store_file(&self, session_id: &usize, data: &[u8]) -> Result<Uuid, rusqlite::Error> {
self.identity.read().unwrap().as_ref().unwrap().store_file(match self.loaded_contacts.read().unwrap().get(session_id) { self.identity.read().unwrap().as_ref().unwrap().store_file(match self.loaded_contacts.read().unwrap().get(session_id) {
Some(contact) => Some(contact.uuid), Some(contact) => Some(contact.uuid),
@ -621,12 +617,12 @@ impl SessionManager {
pub fn load_msgs(&self, session_id: &usize, count: usize) -> Option<Vec<(bool, Vec<u8>)>> { pub fn load_msgs(&self, session_id: &usize, count: usize) -> Option<Vec<(bool, Vec<u8>)>> {
let mut offsets = self.last_loaded_msg_offsets.write().unwrap(); let mut offsets = self.last_loaded_msg_offsets.write().unwrap();
let msgs = self.identity.read().unwrap().as_ref().unwrap().load_msgs( let msgs = self.identity.read().unwrap().as_ref().unwrap().load_msgs(
&self.loaded_contacts.read().unwrap().get(session_id).unwrap().uuid, &self.loaded_contacts.read().unwrap().get(session_id)?.uuid,
*offsets.get(session_id).unwrap(), *offsets.get(session_id)?,
count count
); );
if let Some(msgs) = msgs.as_ref() { if let Some(msgs) = msgs.as_ref() {
*offsets.get_mut(session_id).unwrap() += msgs.len(); *offsets.get_mut(session_id)? += msgs.len();
} }
msgs msgs
} }