diff --git a/Cargo.toml b/Cargo.toml index 6461436..ee45888 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "alfis" -version = "0.1.0" +version = "0.1.1" authors = ["Revertron "] edition = "2018" build = "build.rs" diff --git a/src/main.rs b/src/main.rs index d70920a..1133163 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,7 +22,7 @@ use simple_logger::{SimpleLogger}; #[allow(unused_imports)] use log::{trace, debug, info, warn, error, LevelFilter}; -use alfis::{Blockchain, Bytes, Context, Keystore, Transaction}; +use alfis::{Blockchain, Bytes, Context, Keystore, Transaction, check_domain}; use alfis::event::Event; use alfis::miner::Miner; use alfis::p2p::Network; @@ -50,7 +50,8 @@ fn main() { AttachConsole(ATTACH_PARENT_PROCESS); } - println!("Starting ALFIS 0.1.0"); + let version = env!("CARGO_PKG_VERSION"); + println!("Starting ALFIS {}", version); let args: Vec = env::args().collect(); let program = args[0].clone(); @@ -165,10 +166,12 @@ fn run_interface(context: Arc>, miner: Arc>) { let scripts = inline_script(include_str!("webview/scripts.js")); let html = Content::Html(file_content.to_owned().replace("{styles}", &styles).replace("{scripts}", &scripts)); + let title = format!("ALFIS {}", env!("CARGO_PKG_VERSION")); let mut interface = web_view::builder() - .title("ALFIS 0.1.0") + .title(&title) .content(html) - .size(1024, 720) + .size(1023, 720) + .min_size(895, 350) .resizable(true) .debug(false) .user_data(()) @@ -242,18 +245,22 @@ fn run_interface(context: Arc>, miner: Arc>) { } } CheckDomain { name} => { + let name = name.to_lowercase(); let c = context.lock().unwrap(); let available = c.get_blockchain().is_domain_available(&name, &c.get_keystore()); web_view.eval(&format!("domainAvailable({})", available)).expect("Error evaluating!"); } CreateDomain { name, records, .. } => { debug!("Got records: {}", records); + let name = name.to_lowercase(); + if !check_domain(&name, true) { + return Ok(()); + } if serde_json::from_str::>(&records).is_ok() { - let keystore = { - let guard = context.lock().unwrap(); - guard.get_keystore() + let (keystore, transaction) = { + let context = context.lock().unwrap(); + (context.get_keystore(), context.blockchain.get_domain_transaction(&name)) }; - let transaction = { context.lock().unwrap().blockchain.get_domain_transaction(&name) }; match transaction { None => { create_domain(miner.clone(), name, records, &keystore); @@ -275,6 +282,37 @@ fn run_interface(context: Arc>, miner: Arc>) { ChangeDomain { .. } => {} RenewDomain { .. } => {} TransferDomain { .. } => {} + CheckZone { name} => { + let name = name.to_lowercase(); + if !check_domain(&name, false) { + web_view.eval("zoneAvailable(false)").expect("Error evaluating!"); + } else { + let c = context.lock().unwrap(); + let available = c.get_blockchain().is_domain_available(&name, &c.get_keystore()); + web_view.eval(&format!("zoneAvailable({})", available)).expect("Error evaluating!"); + } + } + CreateZone { name, data } => { + let name = name.to_lowercase(); + let data = data.to_lowercase(); + let (keystore, transaction) = { + let context = context.lock().unwrap(); + (context.get_keystore(), context.blockchain.get_domain_transaction(&name)) + }; + match transaction { + None => { + create_domain(miner.clone(), name, data, &keystore); + } + Some(transaction) => { + if transaction.pub_key == keystore.get_public() { + create_domain(miner.clone(), name, data, &keystore); + } else { + warn!("Tried to mine not owned domain!"); + let _ = web_view.eval(&format!("showWarning('{}');", "You cannot change domain that you don't own!")); + } + } + } + } StopMining => { context.lock().unwrap().bus.post(Event::ActionStopMining); } @@ -419,6 +457,8 @@ pub enum Cmd { LoadKey{}, CreateKey{}, SaveKey{}, + CheckZone{name: String}, + CreateZone{name: String, data: String}, CheckDomain{name: String}, CreateDomain{name: String, records: String, tags: String}, ChangeDomain{name: String, records: String, tags: String}, diff --git a/src/p2p/peers.rs b/src/p2p/peers.rs index fe26da4..3e27cea 100644 --- a/src/p2p/peers.rs +++ b/src/p2p/peers.rs @@ -67,7 +67,7 @@ impl Peers { if self.peers .iter() - .find(|(token, peer)| peer.get_addr() == addr) + .find(|(_token, peer)| peer.get_addr() == addr) .is_some() { debug!("Skipping address from exchange: {}", &addr); continue; diff --git a/src/utils.rs b/src/utils.rs index ff4a5e2..2956f12 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -19,6 +19,38 @@ pub fn from_hex(string: &str) -> Result, num::ParseIntError> { .collect() } +pub fn check_domain(name: &str, allow_dots: bool) -> bool { + if name.starts_with('.') || name.starts_with('-') || name.ends_with('.') || name.ends_with('-') { + return false; + } + let mut last_dot = false; + let mut last_hyphen = false; + for char in name.chars() { + if allow_dots && char == '.' { + if last_dot { + return false; + } else { + last_dot = true; + continue; + } + } + if char == '-' { + if last_hyphen { + return false; + } else { + last_hyphen = true; + continue; + } + } + last_dot = false; + last_hyphen = false; + if !char.is_alphanumeric() { + return false; + } + } + true +} + fn split_n(s: &str, n: usize) -> Vec<&str> { (0..=(s.len() - n + 1) / 2) .map(|i| &s[2 * i..2 * i + n]) @@ -53,4 +85,24 @@ pub fn random_string(length: usize) -> String { result.push(c); } result +} + +#[cfg(test)] +mod test { + use crate::check_domain; + + #[test] + fn test_check_domain() { + assert!(check_domain("abc0", false)); + assert!(!check_domain("ab.c", false)); + assert!(check_domain("a.b.c", true)); + assert!(!check_domain("ab..c", true)); + assert!(check_domain("a-b.c", true)); + assert!(!check_domain("a--b.c", true)); + assert!(check_domain("a-0-b.c", true)); + assert!(!check_domain("-ab.c", true)); + assert!(!check_domain("ab.c-", true)); + assert!(!check_domain(".ab.c", true)); + assert!(!check_domain("ab.c-", true)); + } } \ No newline at end of file diff --git a/src/webview/index.html b/src/webview/index.html index d9d5d78..73933ab 100644 --- a/src/webview/index.html +++ b/src/webview/index.html @@ -128,6 +128,7 @@