diff --git a/.travis.yml b/.travis.yml index 0651152..7c6ee33 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,12 +4,12 @@ matrix: include: # works on Precise and Trusty - os: linux - - dist: xenial + - dist: bionec compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] - packages: ['clang-3.7', 'g++-5'] + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-7'] + packages: ['clang-7', 'g++-5'] before_script: - export PATH="$PATH:$HOME/.cargo/bin" @@ -20,10 +20,10 @@ before_install: - gem install bundler - curl -sSL https://sh.rustup.rs | sh -s -- -y --default-toolchain=nightly --profile=minimal - export PATH="$PATH:$HOME/.cargo/bin" - - sudo add-apt-repository ppa:beineri/opt-qt591-xenial -y + - sudo add-apt-repository ppa:beineri/opt-qt-5.14.2-bionic -y - sudo apt-get update -qq - - sudo apt-get install qt59base qt59websockets libgl1-mesa-dev - - source /opt/qt59/bin/qt59-env.sh + - sudo apt-get install qt514base qt514websockets libgl1-mesa-dev + - source /opt/qt514/bin/qt514-env.sh - chmod +x res/libsodium/buildlibsodium.sh script: diff --git a/application.qrc b/application.qrc index cd094ae..5fc7a70 100644 --- a/application.qrc +++ b/application.qrc @@ -47,8 +47,11 @@ res/addContactBlack.png res/unknownBlack.png res/unknownWhite.png - res/hush-passion.png res/dark-01.png + res/money-mouth.png + res/money-outgoing.png + res/hush-money-white.png + res/hushdlogo.gif @@ -59,6 +62,27 @@ res/loaderblack.gif res/loaderwhite.gif + + res/emoji/emoji1.png + res/emoji/laughing.png + res/emoji/money-mouth.png + res/emoji/sweet_smile.png + res/emoji/joy.png + res/emoji/innocent.png + res/emoji/partying_face.png + res/emoji/face_with_3hearts.png + res/emoji/face-with-rolling-eyes.png + res/emoji/face-with-tongue.png + res/emoji/heart_shaped_eyes.png + res/emoji/nauseated-face.png + res/emoji/pile-of-poo.png + res/emoji/serious-face-with-symbols-covering-mouth.png + res/emoji/smiling-face-with-sunglasses.png + res/emoji/stuck-out.png + res/emoji/sweet_smile.png + res/emoji/hush-money-white.png + res/emoji/SD.png + res/silentdragonlite_de.qm res/silentdragonlite_es.qm diff --git a/lib/Cargo.lock b/lib/Cargo.lock index df000b4..c6b8ef0 100644 --- a/lib/Cargo.lock +++ b/lib/Cargo.lock @@ -128,14 +128,6 @@ name = "base58" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "base64" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "base64" version = "0.11.0" @@ -315,16 +307,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "core-foundation" -version = "0.6.4" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "core-foundation-sys" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -598,7 +590,7 @@ dependencies = [ [[package]] name = "h2" -version = "0.2.1" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -610,8 +602,8 @@ dependencies = [ "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -687,23 +679,23 @@ dependencies = [ [[package]] name = "hyper" -version = "0.13.2" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-channel 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1050,7 +1042,7 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "1.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1192,7 +1184,7 @@ dependencies = [ "blake3 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "silentdragonlitelib 0.1.0 (git+https://github.com/MyHush/silentdragonlite-cli?rev=07288de82d84b9bf35d1210ccc98eb1e4b757eb7)", + "silentdragonlitelib 0.1.0 (git+https://github.com/MyHush/silentdragonlite-cli?rev=6c3f6f22bfc642c714c1e43f6e09cb4d34c7a1de)", ] [[package]] @@ -1490,10 +1482,10 @@ dependencies = [ [[package]] name = "rustls" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)", "sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1502,13 +1494,13 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.1.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", "schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1557,21 +1549,22 @@ dependencies = [ [[package]] name = "security-framework" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "security-framework-sys" -version = "0.3.3" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1655,7 +1648,7 @@ dependencies = [ [[package]] name = "silentdragonlitelib" version = "0.1.0" -source = "git+https://github.com/MyHush/silentdragonlite-cli?rev=07288de82d84b9bf35d1210ccc98eb1e4b757eb7#07288de82d84b9bf35d1210ccc98eb1e4b757eb7" +source = "git+https://github.com/MyHush/silentdragonlite-cli?rev=6c3f6f22bfc642c714c1e43f6e09cb4d34c7a1de#6c3f6f22bfc642c714c1e43f6e09cb4d34c7a1de" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "bellman 0.1.0 (git+https://github.com/MyHush/librustzcash.git?rev=1a0204113d487cdaaf183c2967010e5214ff9e37)", @@ -1682,9 +1675,9 @@ dependencies = [ "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sodiumoxide 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-rustls 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tonic 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tonic 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tonic-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1843,7 +1836,7 @@ dependencies = [ [[package]] name = "tokio" -version = "0.2.11" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1860,13 +1853,13 @@ dependencies = [ "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-macros" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1876,18 +1869,18 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.12.2" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-util" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1895,31 +1888,31 @@ dependencies = [ "futures-sink 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tonic" -version = "0.1.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "async-stream 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "async-trait 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", - "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.13.6 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "prost 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "prost-derive 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustls-native-certs 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-rustls 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls-native-certs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "tower 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "tower-balance 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-load 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1968,7 +1961,7 @@ dependencies = [ "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "tower-discover 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-load 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1985,7 +1978,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tracing 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2013,7 +2006,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2026,7 +2019,7 @@ dependencies = [ "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "tower-discover 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2047,7 +2040,7 @@ name = "tower-make" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2060,7 +2053,7 @@ dependencies = [ "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2071,7 +2064,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2087,7 +2080,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "tower-layer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2468,7 +2461,6 @@ dependencies = [ "checksum backtrace 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)" = "7f80256bc78f67e7df7e36d77366f636ed976895d91fe2ab9efa3973e8fe8c4f" "checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" -"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" "checksum bech32 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cdcf67bb7ba7797a081cd19009948ab533af7c355d5caf1d08c777582d351e9c" "checksum bellman 0.1.0 (git+https://github.com/MyHush/librustzcash.git?rev=1a0204113d487cdaaf183c2967010e5214ff9e37)" = "" @@ -2492,8 +2484,8 @@ dependencies = [ "checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" -"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" -"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" +"checksum core-foundation 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +"checksum core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "24ce9782d4d5c53674646a6a4c1863a21a8fc0cb649b3c94dfc16e45071dea19" "checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" @@ -2528,7 +2520,7 @@ dependencies = [ "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" "checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" "checksum group 0.1.0 (git+https://github.com/MyHush/librustzcash.git?rev=1a0204113d487cdaaf183c2967010e5214ff9e37)" = "" -"checksum h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9433d71e471c1736fd5a61b671fc0b148d7a2992f666c958d03cd8feb3b88d1" +"checksum h2 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" @@ -2538,7 +2530,7 @@ dependencies = [ "checksum http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -"checksum hyper 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1c527bbc634be72aa7ba31e4e4def9bbb020f5416916279b7c705cd838893e" +"checksum hyper 0.13.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a6e7655b9594024ad0ee439f3b5a7299369dc2a3f459b47c696f9ff676f9aa1f" "checksum indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b54058f0a6ff80b6803da8faf8997cde53872b38f4023728f6830b06cd3c0dc" "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" "checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" @@ -2578,7 +2570,7 @@ dependencies = [ "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" -"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" +"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" "checksum petgraph 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29c127eea4a29ec6c85d153c59dc1213f33ec74cead30fe4730aecc88cc1fd92" "checksum pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7804a463a8d9572f13453c516a5faea534a2403d7ced2f0c7e100eeff072772c" "checksum pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "385322a45f2ecf3410c68d2a549a4a2685e8051d0f278e39743ff4e451cb9b3f" @@ -2628,16 +2620,16 @@ dependencies = [ "checksum rust-embed-utils 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97655158074ccb2d2cfb1ccb4c956ef0f4054e43a2c1e71146d4991e6961e105" "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e" -"checksum rustls-native-certs 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51ffebdbb48c14f84eba0b715197d673aff1dd22cc1007ca647e28483bbcc307" +"checksum rustls 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0d4a31f5d68413404705d6982529b0e11a9aacd4839d1d6222ee3b8cb4015e1" +"checksum rustls-native-certs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a75ffeb84a6bd9d014713119542ce415db3a3e4748f0bfce1e1416cd224a23a5" "checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" "checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" "checksum secp256k1 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e0344a794ff109f85547039536028e12f313178ac1545e49fdf16a530d900a7b" -"checksum security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df" -"checksum security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895" +"checksum security-framework 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "97bbedbe81904398b6ebb054b3e912f99d55807125790f3198ac990d98def5b0" +"checksum security-framework-sys 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" @@ -2647,7 +2639,7 @@ dependencies = [ "checksum serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)" = "691b17f19fc1ec9d94ec0b5864859290dff279dbd7b03f017afda54eb36c3c35" "checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" "checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" -"checksum silentdragonlitelib 0.1.0 (git+https://github.com/MyHush/silentdragonlite-cli?rev=07288de82d84b9bf35d1210ccc98eb1e4b757eb7)" = "" +"checksum silentdragonlitelib 0.1.0 (git+https://github.com/MyHush/silentdragonlite-cli?rev=6c3f6f22bfc642c714c1e43f6e09cb4d34c7a1de)" = "" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" "checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" @@ -2665,11 +2657,11 @@ dependencies = [ "checksum thread-id 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7fbf4c9d56b320106cd64fd024dadfa0be7cb4706725fc44a7d7ce952d820c1" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" "checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" -"checksum tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8fdd17989496f49cdc57978c96f0c9fe5e4a58a8bddc6813c449a4624f6a030b" -"checksum tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f4b1e7ed7d5d4c2af3d999904b0eebe76544897cdbfb2b9684bed2174ab20f7c" -"checksum tokio-rustls 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "141afec0978abae6573065a48882c6bae44c5cc61db9b511ac4abf6a09bfd9cc" -"checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" -"checksum tonic 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08283643b1d483eb7f3fc77069e63b5cba3e4db93514b3d45470e67f123e4e48" +"checksum tokio 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58" +"checksum tokio-macros 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" +"checksum tokio-rustls 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4adb8b3e5f86b707f1b54e7c15b6de52617a823608ccda98a15d3a24222f265a" +"checksum tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" +"checksum tonic 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4afef9ce97ea39593992cf3fa00ff33b1ad5eb07665b31355df63a690e38c736" "checksum tonic-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0436413ba71545bcc6c2b9a0f9d78d72deb0123c6a75ccdfe7c056f9930f5e52" "checksum tower 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd3169017c090b7a28fce80abaad0ab4f5566423677c9331bb320af7e49cfe62" "checksum tower-balance 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a792277613b7052448851efcf98a2c433e6f1d01460832dc60bef676bc275d4c" diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 5d7a33c..d0c3d50 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -12,4 +12,4 @@ crate-type = ["staticlib"] libc = "0.2.58" lazy_static = "1.4.0" blake3 = "0.3.4" -silentdragonlitelib = { git = "https://github.com/MyHush/silentdragonlite-cli", rev = "07288de82d84b9bf35d1210ccc98eb1e4b757eb7" } +silentdragonlitelib = { git = "https://github.com/MyHush/silentdragonlite-cli", rev = "6c3f6f22bfc642c714c1e43f6e09cb4d34c7a1de" } diff --git a/lib/silentdragonlitelib.h b/lib/silentdragonlitelib.h index 638ac0c..4e1c983 100644 --- a/lib/silentdragonlitelib.h +++ b/lib/silentdragonlitelib.h @@ -6,11 +6,11 @@ extern "C" { #endif extern bool litelib_wallet_exists (const char* chain_name); -extern char * litelib_initialize_new (bool dangerous, const char* server); +extern char * litelib_initialize_new (const char* server); extern char * litelib_initialize_new_from_phrase - (bool dangerous, const char* server, const char* seed, + (const char* server, const char* seed, unsigned long long birthday, unsigned long long number); -extern char * litelib_initialize_existing (bool dangerous, const char* server); +extern char * litelib_initialize_existing (const char* server); extern char * litelib_execute (const char* s, const char* args); extern void litelib_rust_free_string (char* s); extern char * blake3_PW (char* pw); diff --git a/lib/src/lib.rs b/lib/src/lib.rs index 174c2b8..3314c90 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -57,7 +57,7 @@ return e_str.into_raw(); /// Create a new wallet and return the seed for the newly created wallet. #[no_mangle] -pub extern fn litelib_initialize_new(dangerous: bool, server: *const c_char) -> *mut c_char { +pub extern fn litelib_initialize_new(server: *const c_char) -> *mut c_char { let server_str = unsafe { assert!(!server.is_null()); @@ -65,7 +65,7 @@ pub extern fn litelib_initialize_new(dangerous: bool, server: *const c_char) -> }; let server = LightClientConfig::get_server_or_default(Some(server_str)); - let (config, latest_block_height) = match LightClientConfig::create(server, dangerous) { + let (config, latest_block_height) = match LightClientConfig::create(server) { Ok((c, h)) => (c, h), Err(e) => { let e_str = CString::new(format!("Error: {}", e)).unwrap(); @@ -101,8 +101,8 @@ pub extern fn litelib_initialize_new(dangerous: bool, server: *const c_char) -> /// Restore a wallet from the seed phrase #[no_mangle] -pub extern fn litelib_initialize_new_from_phrase(dangerous: bool, server: *const c_char, - seed: *const c_char, birthday: u64, number: u64) -> *mut c_char { +pub extern fn litelib_initialize_new_from_phrase(server: *const c_char, + seed: *const c_char, birthday: u64, number: u64, overwrite: bool) -> *mut c_char { let server_str = unsafe { assert!(!server.is_null()); @@ -116,7 +116,7 @@ pub extern fn litelib_initialize_new_from_phrase(dangerous: bool, server: *const }; let server = LightClientConfig::get_server_or_default(Some(server_str)); - let (config, _latest_block_height) = match LightClientConfig::create(server, dangerous) { + let (config, _latest_block_height) = match LightClientConfig::create(server) { Ok((c, h)) => (c, h), Err(e) => { let e_str = CString::new(format!("Error: {}", e)).unwrap(); @@ -124,7 +124,7 @@ pub extern fn litelib_initialize_new_from_phrase(dangerous: bool, server: *const } }; - let lightclient = match LightClient::new_from_phrase(seed_str, &config, birthday, number, false) { + let lightclient = match LightClient::new_from_phrase(seed_str, &config, birthday, number, overwrite) { Ok(l) => l, Err(e) => { let e_str = CString::new(format!("Error: {}", e)).unwrap(); @@ -143,7 +143,7 @@ pub extern fn litelib_initialize_new_from_phrase(dangerous: bool, server: *const // Initialize a new lightclient and store its value #[no_mangle] -pub extern fn litelib_initialize_existing(dangerous: bool, server: *const c_char) -> *mut c_char { +pub extern fn litelib_initialize_existing(server: *const c_char) -> *mut c_char { let server_str = unsafe { assert!(!server.is_null()); @@ -151,7 +151,7 @@ pub extern fn litelib_initialize_existing(dangerous: bool, server: *const c_char }; let server = LightClientConfig::get_server_or_default(Some(server_str)); - let (config, _latest_block_height) = match LightClientConfig::create(server, dangerous) { + let (config, _latest_block_height) = match LightClientConfig::create(server) { Ok((c, h)) => (c, h), Err(e) => { let e_str = CString::new(format!("Error: {}", e)).unwrap(); diff --git a/res/emoji/SD.png b/res/emoji/SD.png new file mode 100644 index 0000000..a68ab62 Binary files /dev/null and b/res/emoji/SD.png differ diff --git a/res/emoji/emoji1.png b/res/emoji/emoji1.png new file mode 100644 index 0000000..7179819 Binary files /dev/null and b/res/emoji/emoji1.png differ diff --git a/res/emoji/face-with-rolling-eyes.png b/res/emoji/face-with-rolling-eyes.png new file mode 100644 index 0000000..2ac0b71 Binary files /dev/null and b/res/emoji/face-with-rolling-eyes.png differ diff --git a/res/emoji/face-with-tongue.png b/res/emoji/face-with-tongue.png new file mode 100644 index 0000000..b83c921 Binary files /dev/null and b/res/emoji/face-with-tongue.png differ diff --git a/res/emoji/face_with_3hearts.png b/res/emoji/face_with_3hearts.png new file mode 100644 index 0000000..b8b9f5d Binary files /dev/null and b/res/emoji/face_with_3hearts.png differ diff --git a/res/emoji/heart_shaped_eyes.png b/res/emoji/heart_shaped_eyes.png new file mode 100644 index 0000000..ddeefdc Binary files /dev/null and b/res/emoji/heart_shaped_eyes.png differ diff --git a/res/emoji/hush-money-white.png b/res/emoji/hush-money-white.png new file mode 100644 index 0000000..d0e1ebd Binary files /dev/null and b/res/emoji/hush-money-white.png differ diff --git a/res/emoji/innocent.png b/res/emoji/innocent.png new file mode 100644 index 0000000..c58bd37 Binary files /dev/null and b/res/emoji/innocent.png differ diff --git a/res/emoji/joy.png b/res/emoji/joy.png new file mode 100644 index 0000000..cb80d82 Binary files /dev/null and b/res/emoji/joy.png differ diff --git a/res/emoji/laughing.png b/res/emoji/laughing.png new file mode 100644 index 0000000..701c1de Binary files /dev/null and b/res/emoji/laughing.png differ diff --git a/res/emoji/money-mouth.png b/res/emoji/money-mouth.png new file mode 100644 index 0000000..fc262f4 Binary files /dev/null and b/res/emoji/money-mouth.png differ diff --git a/res/emoji/nauseated-face.png b/res/emoji/nauseated-face.png new file mode 100644 index 0000000..88b70c6 Binary files /dev/null and b/res/emoji/nauseated-face.png differ diff --git a/res/emoji/partying_face.png b/res/emoji/partying_face.png new file mode 100644 index 0000000..625c1e8 Binary files /dev/null and b/res/emoji/partying_face.png differ diff --git a/res/emoji/pile-of-poo.png b/res/emoji/pile-of-poo.png new file mode 100644 index 0000000..f063a77 Binary files /dev/null and b/res/emoji/pile-of-poo.png differ diff --git a/res/emoji/serious-face-with-symbols-covering-mouth.png b/res/emoji/serious-face-with-symbols-covering-mouth.png new file mode 100644 index 0000000..917b8fc Binary files /dev/null and b/res/emoji/serious-face-with-symbols-covering-mouth.png differ diff --git a/res/emoji/smiling-face-with-sunglasses.png b/res/emoji/smiling-face-with-sunglasses.png new file mode 100644 index 0000000..4fe13e3 Binary files /dev/null and b/res/emoji/smiling-face-with-sunglasses.png differ diff --git a/res/emoji/stuck-out.png b/res/emoji/stuck-out.png new file mode 100644 index 0000000..fa98c80 Binary files /dev/null and b/res/emoji/stuck-out.png differ diff --git a/res/emoji/sweet_smile.png b/res/emoji/sweet_smile.png new file mode 100644 index 0000000..53b9d41 Binary files /dev/null and b/res/emoji/sweet_smile.png differ diff --git a/res/hush-money-white.png b/res/hush-money-white.png new file mode 100644 index 0000000..7ee8d9a Binary files /dev/null and b/res/hush-money-white.png differ diff --git a/res/hush-money.png b/res/hush-money.png new file mode 100644 index 0000000..eb27d4e Binary files /dev/null and b/res/hush-money.png differ diff --git a/res/money-mouth.png b/res/money-mouth.png new file mode 100644 index 0000000..fc262f4 Binary files /dev/null and b/res/money-mouth.png differ diff --git a/res/money-outgoing.png b/res/money-outgoing.png new file mode 100644 index 0000000..c40b09b Binary files /dev/null and b/res/money-outgoing.png differ diff --git a/res/silentdragonlite.desktop b/res/silentdragonlite.desktop new file mode 100644 index 0000000..bf5b057 --- /dev/null +++ b/res/silentdragonlite.desktop @@ -0,0 +1,13 @@ +[Desktop Entry] +Name=SilentDragonLite +Comment=Lightclient UI wallet for Hush +GenericName=Wallet +Exec=SilentDragonLite %u +Icon=SilentDragonLite +Type=Application +StartupNotify=true +StartupWMClass=SilentDragonLite +Categories=Utility; +MimeType=x-scheme-handler/hush; +Keywords=SilentDragonLite; + diff --git a/silentdragon-lite.pro b/silentdragon-lite.pro index 4338b4b..77544e2 100644 --- a/silentdragon-lite.pro +++ b/silentdragon-lite.pro @@ -14,6 +14,7 @@ QT += widgets QT += websockets + TARGET = SilentDragonLite TEMPLATE = app @@ -121,6 +122,7 @@ HEADERS += \ FORMS += \ src/contactrequest.ui \ src/deposithush.ui \ + src/emoji.ui \ src/encryption.ui \ src/hushrequest.ui \ src/mainwindow.ui \ @@ -129,6 +131,8 @@ FORMS += \ src/newwallet.ui \ src/recurringpayments.ui \ src/restoreseed.ui \ + src/seedrestore.ui \ + src/sendHushTransactionChat.ui \ src/settings.ui \ src/about.ui \ src/confirm.ui \ diff --git a/src/Chat/Helper/ChatDelegator.h b/src/Chat/Helper/ChatDelegator.h index 12f94db..36a856c 100644 --- a/src/Chat/Helper/ChatDelegator.h +++ b/src/Chat/Helper/ChatDelegator.h @@ -51,6 +51,27 @@ inline void ListViewDelegate::paint(QPainter *painter, QStyleOptionViewItem cons bodydoc.setDefaultFont(QFont("Roboto", 12)); QString bodytext(index.data(Qt::DisplayRole).toString()); bodydoc.setHtml(bodytext.replace("\n", "
")); + bodydoc.setHtml(bodytext.replace(":smiley:", "")); + bodydoc.setHtml(bodytext.replace(":-)", "")); + bodydoc.setHtml(bodytext.replace(":money_mouth:", "")); + bodydoc.setHtml(bodytext.replace(":laughing:", "")); + bodydoc.setHtml(bodytext.replace(":sweet_smile:", "")); + bodydoc.setHtml(bodytext.replace(":joy:", "")); + bodydoc.setHtml(bodytext.replace(":innocent:", "")); + bodydoc.setHtml(bodytext.replace(":partying_face:", "")); + bodydoc.setHtml(bodytext.replace(":fire:", "")); + bodydoc.setHtml(bodytext.replace(":rolling_eyes:", "")); + bodydoc.setHtml(bodytext.replace(":stuck_out_tongue:", "")); + bodydoc.setHtml(bodytext.replace(":face_with_3hearts:", "")); + bodydoc.setHtml(bodytext.replace(":heart_eyes:", "")); + bodydoc.setHtml(bodytext.replace(":nauseated:", "")); + bodydoc.setHtml(bodytext.replace(":poop:", "")); + bodydoc.setHtml(bodytext.replace(":symbols_mouth:", "")); + bodydoc.setHtml(bodytext.replace(":sunglass:", "")); + bodydoc.setHtml(bodytext.replace(":stuck_out:", "")); + bodydoc.setHtml(bodytext.replace(";p", "")); + bodydoc.setHtml(bodytext.replace(":hush_white:", "")); + bodydoc.setHtml(bodytext.replace(":sd:", "")); qreal contentswidth = option.rect.width() * d_widthfraction - d_horizontalmargin - d_pointerwidth - d_leftpadding - d_rightpadding; bodydoc.setTextWidth(contentswidth); qreal bodyheight = bodydoc.size().height(); @@ -174,7 +195,27 @@ inline QSize ListViewDelegate::sizeHint(QStyleOptionViewItem const &option, QMod bodydoc.setDefaultFont(QFont("Roboto", 12)); QString bodytext(index.data(Qt::DisplayRole).toString()); bodydoc.setHtml(bodytext.replace("\n", "
")); - + bodydoc.setHtml(bodytext.replace(":smiley:", "")); + bodydoc.setHtml(bodytext.replace(":-)", "")); + bodydoc.setHtml(bodytext.replace(":money_mouth:", "")); + bodydoc.setHtml(bodytext.replace(":laughing:", "")); + bodydoc.setHtml(bodytext.replace(":sweet_smile:", "")); + bodydoc.setHtml(bodytext.replace(":joy:", "")); + bodydoc.setHtml(bodytext.replace(":innocent:", "")); + bodydoc.setHtml(bodytext.replace(":partying_face:", "")); + bodydoc.setHtml(bodytext.replace(":fire:", "")); + bodydoc.setHtml(bodytext.replace(":rolling_eyes:", "")); + bodydoc.setHtml(bodytext.replace(":stuck_out_tongue:", "")); + bodydoc.setHtml(bodytext.replace(":face_with_3hearts:", "")); + bodydoc.setHtml(bodytext.replace(":heart_eyes:", "")); + bodydoc.setHtml(bodytext.replace(":nauseated:", "")); + bodydoc.setHtml(bodytext.replace(":poop:", "")); + bodydoc.setHtml(bodytext.replace(":symbols_mouth:", "")); + bodydoc.setHtml(bodytext.replace(":sunglass:", "")); + bodydoc.setHtml(bodytext.replace(":stuck_out:", "")); + bodydoc.setHtml(bodytext.replace(";p", "")); + bodydoc.setHtml(bodytext.replace(":hush_white:", "")); + bodydoc.setHtml(bodytext.replace(":sd:", "")); // the width of the contents are the (a fraction of the window width) minus (margins + padding + width of the bubble's tail) qreal contentswidth = option.rect.width() * d_widthfraction - d_horizontalmargin - d_pointerwidth - d_leftpadding - d_rightpadding; diff --git a/src/DataStore/ChatDataStore.cpp b/src/DataStore/ChatDataStore.cpp index f8335a6..2818b3a 100644 --- a/src/DataStore/ChatDataStore.cpp +++ b/src/DataStore/ChatDataStore.cpp @@ -116,6 +116,46 @@ std::map ChatDataStore::getAllOldContactRequests() return filteredItems; } +std::map ChatDataStore::getAllCashMemosIncoming() +{ + std::map filteredItems; + + for(auto &c: this->data) + { + if ( + (c.second.isOutgoing() == false) && + (c.second.getType() == "Money") && + (c.second.getMemo().startsWith("{")) + + ) + + { + filteredItems[c.first] = c.second; + } + } + return filteredItems; +} + +std::map ChatDataStore::getAllCashMemosOutgoing() +{ + std::map filteredItems; + + for(auto &c: this->data) + { + if ( + (c.second.isOutgoing() == true) && + (c.second.getType() == "Money") && + (c.second.getMemo().startsWith("{")) + + ) + + { + filteredItems[c.first] = c.second; + } + } + return filteredItems; +} + std::map ChatDataStore::getAllMemos() { std::map filteredItems; diff --git a/src/DataStore/ChatDataStore.h b/src/DataStore/ChatDataStore.h index f31ce7b..276ed53 100644 --- a/src/DataStore/ChatDataStore.h +++ b/src/DataStore/ChatDataStore.h @@ -22,6 +22,8 @@ class ChatDataStore ChatItem getData(QString key); std::map getAllRawChatItems(); std::map getAllNewContactRequests(); + std::map getAllCashMemosOutgoing(); + std::map getAllCashMemosIncoming(); std::map getAllOldContactRequests(); std::map getAllMemos(); QString getPassword(); diff --git a/src/Model/ChatItem.cpp b/src/Model/ChatItem.cpp index 3a190f0..4e1984f 100644 --- a/src/Model/ChatItem.cpp +++ b/src/Model/ChatItem.cpp @@ -158,6 +158,9 @@ QString ChatItem::toChatLine() { QDateTime myDateTime; QString lock; + QString money; + QString moneyText; + QString moneyTextRequest; myDateTime.setTime_t(_timestamp); if (_notarize == true) @@ -175,11 +178,43 @@ QString ChatItem::toChatLine() { lock = " "; - } + }else{} + + if (_memo.startsWith("Money transaction of :")) + { + if (_outgoing == true) + { + + moneyText = QString("
") + QString("
") + QString(" Outgoing Money Transaction ") + QString(" "); + }else{ + + + moneyText = QString("
") + QString("
") + QString(" Incoming Money Transaction ") + QString(" "); + + } + }else{money = ""; + moneyText = ""; } + + if (_memo.startsWith("Request of :")) + { + if (_outgoing == true) + { + + moneyTextRequest = QString("
") + QString("
") + QString(" Outgoing Hush Request ") + QString(" "); + }else{ + + + moneyTextRequest = QString("
") + QString("
") + QString(" Incoming Hush Request ") + QString(" "); + + } + }else{moneyTextRequest = ""; + moneyTextRequest = ""; } + + QString line = QString("") + myDateTime.toString("yyyy-MM-dd hh:mm"); - line += QString(lock) + QString(""); + line += QString(lock) + QString(moneyText) + QString(moneyTextRequest) + QString(""); line +=QString("

") + _memo.toHtmlEscaped() + QString("

"); return line; } diff --git a/src/addressbook.cpp b/src/addressbook.cpp index 1f19fff..4271324 100644 --- a/src/addressbook.cpp +++ b/src/addressbook.cpp @@ -250,6 +250,9 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) ); + parent->ui->listChat->verticalScrollBar()->setValue( + parent->ui->listChat->verticalScrollBar()->maximum()); + }); // AddressBook::getInstance()->addAddressLabel(newLabel, ab.addr->text(), cid); diff --git a/src/chatmodel.cpp b/src/chatmodel.cpp index a0012f9..a3b9775 100644 --- a/src/chatmodel.cpp +++ b/src/chatmodel.cpp @@ -466,6 +466,8 @@ Tx MainWindow::createTxFromChatPage() { if (crypto_kx_seed_keypair(pk,sk, MESSAGEAS1) !=0) { + + this->logger->write("Suspicious keypair, bail out "); } ////////////////Get the pubkey from Bob, so we can create the share key @@ -475,7 +477,7 @@ Tx MainWindow::createTxFromChatPage() { if (crypto_kx_server_session_keys(server_rx, server_tx, pk, sk, pubkeyBob) != 0) { - /* Suspicious client public key, bail out */ + this->logger->write("Suspicious client public send key, bail out "); } @@ -542,6 +544,7 @@ void MainWindow::sendChat() { QMessageBox msg(QMessageBox::Critical, tr("You have to select a contact and insert a Memo"), tr("You have selected no Contact from Contactlist,\n") + tr("\nor your Memo is empty"), QMessageBox::Ok, this); + ui->memoTxtChat->setEnabled(true); msg.exec(); return; @@ -571,6 +574,7 @@ void MainWindow::sendChat() { QMessageBox::Ok, this); msg.exec(); + ui->memoTxtChat->setEnabled(true); // abort the Tx return; @@ -590,6 +594,7 @@ void MainWindow::sendChat() { movie->start(); ui->sendChatButton->show(); ui->sendChatButton->setEnabled(false); + ui->memoTxtChat->setEnabled(true); } else { @@ -599,6 +604,8 @@ void MainWindow::sendChat() { movie1->start(); ui->sendChatButton->show(); ui->sendChatButton->setEnabled(false); + ui->memoTxtChat->setEnabled(true); + } ui->memoTxtChat->clear(); @@ -617,6 +624,8 @@ void MainWindow::sendChat() { ui->sendChatButton->setIcon(sendIcon); movie->stop(); ui->sendChatButton->setEnabled(true); + ui->memoTxtChat->setEnabled(true); + }else{ QPixmap send(":/icons/res/sendBlack.png"); @@ -624,6 +633,7 @@ void MainWindow::sendChat() { ui->sendChatButton->setIcon(sendIcon); movie1->stop(); ui->sendChatButton->setEnabled(true); + ui->memoTxtChat->setEnabled(true); } }); @@ -636,6 +646,7 @@ void MainWindow::sendChat() { // Errored out [=] (QString opid, QString errStr) { ui->statusBar->showMessage(QObject::tr(" Tx ") % opid % QObject::tr(" failed"), 15 * 1000); + ui->memoTxtChat->setEnabled(true); if (!opid.isEmpty()) errStr = QObject::tr("The transaction with id ") % opid % QObject::tr(" failed. The error was") + ":\n\n" + errStr; @@ -650,6 +661,7 @@ void MainWindow::sendChat() { ui->sendChatButton->setIcon(sendIcon); movie->stop(); ui->sendChatButton->setEnabled(true); + ui->memoTxtChat->setEnabled(true); }else{ QPixmap send(":/icons/res/sendBlack.png"); @@ -657,6 +669,7 @@ void MainWindow::sendChat() { ui->sendChatButton->setIcon(sendIcon); movie1->stop(); ui->sendChatButton->setEnabled(true); + ui->memoTxtChat->setEnabled(true); } @@ -674,6 +687,7 @@ QString MainWindow::doSendChatTxValidations(Tx tx) { if (!Settings::isValidAddress(toAddr.addr)) { QString addr = (toAddr.addr.length() > 100 ? toAddr.addr.left(100) + "..." : toAddr.addr); return QString(tr("Recipient Address ")) % addr % tr(" is Invalid"); + ui->memoTxtChat->setEnabled(true); } // This technically shouldn't be possible, but issue #62 seems to have discovered a bug @@ -691,6 +705,7 @@ QString MainWindow::doSendChatTxValidations(Tx tx) { if (available < total) { return tr("Not enough available funds to send this transaction\n\nHave: %1\nNeed: %2\n\nNote: Funds need 1 confirmations before they can be spent") .arg(available.toDecimalhushString(), total.toDecimalhushString()); + ui->memoTxtChat->setEnabled(true); } return ""; @@ -796,7 +811,7 @@ Tx MainWindow::createTxForSafeContactRequest() unsigned char pk[crypto_kx_PUBLICKEYBYTES]; if (crypto_kx_seed_keypair(pk, sk, MESSAGEAS1) !=0) { - // + this->logger->write("Suspicious client public contact request key, bail out "); } QString publicKey = QByteArray(reinterpret_cast(pk), crypto_kx_PUBLICKEYBYTES).toHex(); @@ -828,8 +843,6 @@ void MainWindow::ContactRequest() { if (size > max){ - // auto addr = ""; - // if (! Settings::isZAddress(AddressBook::addressFromAddressLabel(addr->text()))) { QMessageBox msg(QMessageBox::Critical, tr("Your Message is too long"), tr("You can only write messages with 512 character maximum \n") + tr("\n Please reduce your message to 235 character."), QMessageBox::Ok, this); diff --git a/src/connection.cpp b/src/connection.cpp index 7cad23f..ca8c62e 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -67,7 +67,6 @@ void ConnectionLoader::doAutoConnect() { qDebug() << "Doing autoconnect"; auto config = std::shared_ptr(new ConnectionConfig()); - config->dangerous = false; config->server = Settings::getInstance()->getSettings().server; // Initialize the library @@ -78,7 +77,6 @@ void ConnectionLoader::doAutoConnect() { main->logger->write(QObject::tr("Using existing wallet.")); char* resp = litelib_initialize_existing( - config->dangerous, config->server.toStdString().c_str() ); QString response = litelib_process_response(resp); @@ -93,7 +91,7 @@ void ConnectionLoader::doAutoConnect() else { main->logger->write(QObject::tr("Create/restore wallet.")); - createOrRestore(config->dangerous, config->server); + createOrRestore(config->server); d->show(); } @@ -105,11 +103,14 @@ void ConnectionLoader::doAutoConnect() // If success, set the connection main->logger->write("Connection is online."); connection->setInfo(reply); + main->logger->write("getting Connection reply"); isSyncing = new QAtomicInteger(); isSyncing->storeRelaxed(true); + main->logger->write("isSyncing"); // Do a sync at startup syncTimer = new QTimer(main); + main->logger->write("Beginning sync"); connection->doRPCWithDefaultErrorHandling("sync", "", [=](QJsonValue) { isSyncing->storeRelaxed(false); // Cancel the timer @@ -124,10 +125,13 @@ void ConnectionLoader::doAutoConnect() if (isSyncing != nullptr && isSyncing->loadRelaxed()) { // Get the sync status connection->doRPC("syncstatus", "", [=](QJsonValue reply) { + if (isSyncing != nullptr && !reply.toObject()["synced_blocks"].isUndefined()) { qint64 synced = reply["synced_blocks"].toInt(); + main->logger->write("synced_blocks" + synced) ; qint64 total = reply["total_blocks"].toInt(); + main->logger->write("total_blocks" + total) ; me->showInformation( "Synced " + QString::number(synced) + " / " + QString::number(total) ); @@ -141,30 +145,45 @@ void ConnectionLoader::doAutoConnect() syncTimer->setInterval(1* 1000); syncTimer->start(); + main->logger->write("Start sync timer"); }, [=](QString err) { showError(err); }); } -void ConnectionLoader::createOrRestore(bool dangerous, QString server) +void ConnectionLoader::createOrRestore(QString server) { // Close the startup dialog, since we'll be showing the wizard d->hide(); // Create a wizard - FirstTimeWizard wizard(dangerous, server); + FirstTimeWizard wizard(server); + main->logger->write("Start new Wallet with FirstimeWizard"); wizard.exec(); } void ConnectionLoader::doRPCSetConnection(Connection* conn) { qDebug() << "Connectionloader finished, setting connection"; + main->logger->write("Connectionloader finished, setting connection"); rpc->setConnection(conn); d->accept(); QTimer::singleShot(1, [=]() { delete this; }); +try +{ + QFile plaintextWallet(dirwalletconnection); + main->logger->write("Path to Wallet.dat : " ); plaintextWallet.remove(); + +}catch (...) + +{ + + main->logger->write("no Plaintext wallet.dat"); +} + } Connection* ConnectionLoader::makeConnection(std::shared_ptr config) diff --git a/src/connection.h b/src/connection.h index a253e2f..9076abd 100644 --- a/src/connection.h +++ b/src/connection.h @@ -10,7 +10,6 @@ class Controller; struct ConnectionConfig { QString server; - bool dangerous; QString proxy; }; @@ -32,7 +31,7 @@ private: void doAutoConnect(); - void createOrRestore(bool dangerous, QString server); + void createOrRestore(QString server); void showError(QString explanation); void showInformation(QString info, QString detail = ""); diff --git a/src/controller.cpp b/src/controller.cpp index 7042a3f..a33a38f 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -101,6 +101,9 @@ void Controller::setConnection(Connection* c) ui->listContactWidget ); + + ui->listChat->verticalScrollBar()->setValue( + ui->listChat->verticalScrollBar()->maximum()); } std::string Controller::encryptDecrypt(std::string toEncrypt) @@ -635,7 +638,7 @@ void Controller::getInfoThenRefresh(bool force) refreshAddresses(); // This calls refreshZSentTransactions() and refreshReceivedZTrans() refreshTransactions(); } - + refreshBalances(); int lag = longestchain - notarized ; this->setLag(lag); }, [=](QString err) { @@ -727,7 +730,7 @@ void Controller::processUnspent(const QJsonValue& reply, QMap* QString qsAddr = it["address"].toString(); int block = it["created_in_block"].toInt(); QString txid = it["created_in_txid"].toString(); - CAmount amount = CAmount::fromqint64(it["value"].toInt()); + CAmount amount = CAmount::fromqint64(it["value"].toDouble()); bool spendable = it["unconfirmed_spent"].isNull() && it["spent"].isNull(); // TODO: Wait for 1 confirmations bool pending = !it["unconfirmed_spent"].isNull(); @@ -738,7 +741,7 @@ void Controller::processUnspent(const QJsonValue& reply, QMap* if (spendable) { (*balancesMap)[qsAddr] = (*balancesMap)[qsAddr] + - CAmount::fromqint64(it["value"].toInt()); + CAmount::fromqint64(it["value"].toDouble()); } } }; @@ -903,9 +906,9 @@ void Controller::refreshBalances() // 1. Get the Balances zrpc->fetchBalance([=] (QJsonValue reply) { - CAmount balT = CAmount::fromqint64(reply["tbalance"].toInt()); - CAmount balZ = CAmount::fromqint64(reply["zbalance"].toInt()); - CAmount balVerified = CAmount::fromqint64(reply["verified_zbalance"].toInt()); + CAmount balT = CAmount::fromqint64(reply["tbalance"].toDouble()); + CAmount balZ = CAmount::fromqint64(reply["zbalance"].toDouble()); + CAmount balVerified = CAmount::fromqint64(reply["verified_zbalance"].toDouble()); model->setBalT(balT); model->setBalZ(balZ); @@ -982,7 +985,7 @@ void Controller::refreshTransactions() { address = o.toObject()["address"].toString(); // Sent items are -ve - CAmount amount = CAmount::fromqint64(-1* o.toObject()["value"].toInt()); + CAmount amount = CAmount::fromqint64(-1* o.toObject()["value"].toDouble()); // Check for Memos @@ -990,7 +993,7 @@ void Controller::refreshTransactions() { chatModel->addconfirmations(txid, confirmations); } - if ((confirmations == 1) && (chatModel->getConfirmationByTx(txid) != QString("0xdeadbeef"))) { + if ((confirmations > 0) && (chatModel->getConfirmationByTx(txid) != QString("0xdeadbeef"))) { DataStore::getChatDataStore()->clear(); chatModel->killConfirmationCache(); chatModel->killMemoCache(); @@ -1083,7 +1086,7 @@ void Controller::refreshTransactions() { if (crypto_kx_seed_keypair(pk, sk, MESSAGEAS1) !=0) { - // ? + main->logger->write("Keypair outgoing error"); } unsigned char server_rx[crypto_kx_SESSIONKEYBYTES], server_tx[crypto_kx_SESSIONKEYBYTES]; @@ -1095,7 +1098,7 @@ void Controller::refreshTransactions() { if (crypto_kx_server_session_keys(server_rx, server_tx, pk, sk, pubkeyBob) != 0) { - /* Suspicious client public key, bail out */ + main->logger->write("Suspicious client public outgoing key, bail out "); } const QByteArray ba = QByteArray::fromHex(memo.toUtf8()); @@ -1108,7 +1111,7 @@ void Controller::refreshTransactions() { QString memodecrypt; - if (encryptedMemoSize1 > 15) + if ((encryptedMemoSize1 - crypto_secretstream_xchacha20poly1305_ABYTES) > 0) { //////unsigned char* as message from QString #define MESSAGE2 (const unsigned char *) encryptedMemo @@ -1143,6 +1146,7 @@ void Controller::refreshTransactions() { } else { + memodecrypt = ""; } @@ -1165,7 +1169,7 @@ void Controller::refreshTransactions() { ); DataStore::getChatDataStore()->setData(ChatIDGenerator::getInstance()->generateID(item), item); - updateUIBalances(); + // updateUIBalances(); } } @@ -1190,18 +1194,18 @@ void Controller::refreshTransactions() { } else { - // Incoming Transaction + + { // Incoming Transaction address = (it.toObject()["address"].isNull() ? "" : it.toObject()["address"].toString()); model->markAddressUsed(address); QString memo; - if (!it.toObject()["memo"].isNull()) { + if (!it.toObject()["memo"].isNull()) memo = it.toObject()["memo"].toString(); - } items.push_back(TransactionItemDetail{ address, - CAmount::fromqint64(it.toObject()["amount"].toInt()), + CAmount::fromqint64(it.toObject()["amount"].toDouble()), memo }); @@ -1210,7 +1214,14 @@ void Controller::refreshTransactions() { }; txdata.push_back(tx); - + } + + address = (it.toObject()["address"].isNull() ? "" : it.toObject()["address"].toString()); + model->markAddressUsed(address); + + QString memo; + if (!it.toObject()["memo"].isNull()) + memo = it.toObject()["memo"].toString(); QString type; QString publickey; QString headerbytes; @@ -1306,7 +1317,9 @@ void Controller::refreshTransactions() { int position = it.toObject()["position"].toInt(); - if ((memo.startsWith("{") == false) && (headerbytes > 0)) + int ciphercheck = memo.length() - crypto_secretstream_xchacha20poly1305_ABYTES; + + if ((memo.startsWith("{") == false) && (headerbytes > 0) && (ciphercheck > 0)) { if (chatModel->getMemoByTx(txid) == QString("0xdeadbeef")) { @@ -1337,7 +1350,7 @@ void Controller::refreshTransactions() { if (crypto_kx_seed_keypair(pk, sk, MESSAGEAS1) !=0) { - // + main->logger->write("Suspicious outgoing key pair, bail out "); } unsigned char client_rx[crypto_kx_SESSIONKEYBYTES], client_tx[crypto_kx_SESSIONKEYBYTES]; @@ -1348,7 +1361,7 @@ void Controller::refreshTransactions() { if (crypto_kx_client_session_keys(client_rx, client_tx, pk, sk, pubkeyBob) != 0) { - /* Suspicious client public key, bail out */ + main->logger->write("Suspicious client public incoming key, bail out "); } const QByteArray ba = QByteArray::fromHex(memo.toUtf8()); @@ -1379,12 +1392,12 @@ void Controller::refreshTransactions() { /////Only the QString gives weird data, so convert first to std::string // crypto_secretstream_xchacha20poly1305_keygen(client_rx); if (crypto_secretstream_xchacha20poly1305_init_pull(&state, header, client_rx) != 0) { - /* Invalid header, no need to go any further */ + main->logger->write("Invalid header incoming, no need to go any further "); } if (crypto_secretstream_xchacha20poly1305_pull (&state, decrypted, NULL, tag, MESSAGE2, CIPHERTEXT1_LEN, NULL, 0) != 0) { - /* Invalid/incomplete/corrupted ciphertext - abort */ + main->logger->write("Invalid/incomplete/corrupted ciphertext - abort"); } std::string decryptedMemo(reinterpret_cast(decrypted),MESSAGE1_LEN); @@ -1464,8 +1477,9 @@ void Controller::refreshTransactions() { chat->renderChatBox(ui, ui->listChat,ui->memoSizeChat); ui->listChat->verticalScrollBar()->setValue( ui->listChat->verticalScrollBar()->maximum()); - + }); + } void Controller::refreshChat(QListView *listWidget, QLabel *label) @@ -1479,6 +1493,8 @@ void Controller::refreshChat(QListView *listWidget, QLabel *label) void Controller::refreshContacts(QListView *listWidget) { contactModel->renderContactList(listWidget); + ui->listChat->verticalScrollBar()->setValue( + ui->listChat->verticalScrollBar()->maximum()); } // If the wallet is encrpyted and locked, we need to unlock it diff --git a/src/emoji.ui b/src/emoji.ui new file mode 100644 index 0000000..8118466 --- /dev/null +++ b/src/emoji.ui @@ -0,0 +1,339 @@ + + + emojiDialog + + + + 0 + 0 + 261 + 150 + + + + Emoji + + + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + + + + :/emoji/res/emoji/emoji1.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/laughing.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/sweet_smile.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/joy.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/innocent.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/partying_face.png + + + + true + + + + + + + + + + + :/icons/res/money-mouth.png + + + + true + + + + + + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + + + + :/emoji/res/emoji/face-with-rolling-eyes.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/face-with-tongue.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/face_with_3hearts.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/heart_shaped_eyes.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/nauseated-face.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/pile-of-poo.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/serious-face-with-symbols-covering-mouth.png + + + + true + + + + + + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + + + + :/emoji/res/emoji/smiling-face-with-sunglasses.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/stuck-out.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/hush-money-white.png + + + + true + + + + + + + + + + + :/emoji/res/emoji/SD.png + + + + true + + + + + + + + + + diff --git a/src/firsttimewizard.cpp b/src/firsttimewizard.cpp index 20e7d46..38901c9 100644 --- a/src/firsttimewizard.cpp +++ b/src/firsttimewizard.cpp @@ -9,10 +9,9 @@ #include "../lib/silentdragonlitelib.h" -FirstTimeWizard::FirstTimeWizard(bool dangerous, QString server) +FirstTimeWizard::FirstTimeWizard(QString server) { setWindowTitle("New wallet wizard"); - this->dangerous = dangerous; this->server = server; ////backup addresslabels.dat if there is one, to restore it later @@ -65,12 +64,23 @@ NewOrRestorePage::NewOrRestorePage(FirstTimeWizard *parent) : QWizardPage(parent parent->button(QWizard::CommitButton)->setEnabled(false); setButtonText(QWizard::CommitButton, "Next"); + form.txtPassword->setEnabled(false); + form.txtConfirmPassword->setEnabled(false); + + QObject::connect(form.TOS, &QRadioButton::clicked, [=](bool checked) { + if (checked) { + + form.txtPassword->setEnabled(true); + form.txtConfirmPassword->setEnabled(true); + + } + }); auto fnPasswordEdited = [=](const QString&) { // Enable the Finish button if the passwords match. QString passphraseBlank = form.txtPassword->text(); - + QString passphrase = QString("HUSH3") + passphraseBlank + QString("SDL"); @@ -83,6 +93,7 @@ NewOrRestorePage::NewOrRestorePage(FirstTimeWizard *parent) : QWizardPage(parent form.radioRestoreWallet->setEnabled(true); form.radioNewWallet->setEnabled(true); form.radioNewWallet->setChecked(true); + parent->button(QWizard::CommitButton)->setEnabled(true); int length = passphrase.length(); @@ -134,12 +145,7 @@ NewOrRestorePage::NewOrRestorePage(FirstTimeWizard *parent) : QWizardPage(parent } }); - QObject::connect(form.TOS, &QRadioButton::clicked, [=](bool checked) { - if (checked) { - parent->button(QWizard::CommitButton)->setEnabled(true); - - } - }); + @@ -187,7 +193,7 @@ NewSeedPage::NewSeedPage(FirstTimeWizard *parent) : QWizardPage(parent) { void NewSeedPage::initializePage() { // Call the library to create a new wallet. - char* resp = litelib_initialize_new(parent->dangerous, parent->server.toStdString().c_str()); + char* resp = litelib_initialize_new(parent->server.toStdString().c_str()); QString reply = litelib_process_response(resp); QByteArray ba_reply = reply.toUtf8(); @@ -266,7 +272,7 @@ QString number_str = form.number->text(); qint64 number = number_str.toUInt(); // 3. Attempt to restore wallet with the seed phrase { - char* resp = litelib_initialize_new_from_phrase(parent->dangerous, parent->server.toStdString().c_str(), + char* resp = litelib_initialize_new_from_phrase(parent->server.toStdString().c_str(), seed.toStdString().c_str(), birthday, number); QString reply = litelib_process_response(resp); diff --git a/src/firsttimewizard.h b/src/firsttimewizard.h index 324f115..8b6de40 100644 --- a/src/firsttimewizard.h +++ b/src/firsttimewizard.h @@ -16,7 +16,7 @@ class FirstTimeWizard: public QWizard public: - FirstTimeWizard(bool dangerous, QString server); + FirstTimeWizard(QString server); protected: @@ -29,7 +29,6 @@ private: Page_Restore }; - bool dangerous; QString server; friend class NewOrRestorePage; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6910eff..84aa862 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -17,13 +17,16 @@ #include "settings.h" #include "version.h" #include "connection.h" +#include "ui_sendHushTransactionChat.h" #include "ui_contactrequest.h" #include "ui_deposithush.h" +#include "ui_emoji.h" #include "ui_requestContactDialog.h" #include "chatmodel.h" #include "requestdialog.h" #include "ui_startupencryption.h" #include "ui_removeencryption.h" +#include "ui_seedrestore.h" #include "websockets.h" #include "sodium.h" #include "sodium/crypto_generichash_blake2b.h" @@ -34,6 +37,9 @@ #include "DataStore/DataStore.h" #include "firsttimewizard.h" #include "../lib/silentdragonlitelib.h" +#include +#include +#include #ifdef Q_OS_WIN @@ -157,17 +163,124 @@ MainWindow::MainWindow(QWidget *parent) : // Rescan QObject::connect(ui->actionRescan, &QAction::triggered, [=]() { - // To rescan, we clear the wallet state, and then reload the connection + + QFile file(dirwalletenc); + QFile file1(dirwallet); + + if(fileExists(dirwalletenc)) + + { + file.remove(); + file1.remove(); + } + + + Ui_Restore restoreSeed; + QDialog dialog(this); + restoreSeed.setupUi(&dialog); + Settings::saveRestore(&dialog); + + + rpc->fetchSeed([&](QJsonValue reply) { + if (isJsonError(reply)) { + return; + } + + restoreSeed.seed->setReadOnly(true); + restoreSeed.seed->setLineWrapMode(QPlainTextEdit::LineWrapMode::NoWrap); + QString seedJson = QLatin1String(QJsonDocument(reply.toObject()).toJson(QJsonDocument::Compact)); + int startPos = seedJson.indexOf("seed") +7; + int endPos = seedJson.indexOf("}") -1; + int length = endPos - startPos; + QString seed = seedJson.mid(startPos, length); + restoreSeed.seed->setPlainText(seed); + + int startPosB = seedJson.indexOf("birthday") +10; + int endPosB = seedJson.indexOf("seed") -2; + int lengthB = endPosB - startPosB; + QString birthday = seedJson.mid(startPosB, lengthB); + restoreSeed.birthday->setPlainText(birthday); + }); + + QObject::connect(restoreSeed.restore, &QPushButton::clicked, [&](){ + + QString seed = restoreSeed.seed->toPlainText(); + if (seed.trimmed().split(" ").length() != 24) { + QMessageBox::warning(this, tr("Failed to restore wallet"), + tr("SilentDragonLite needs 24 words to restore wallet"), + QMessageBox::Ok); + return false; + } + + + // 2. Validate birthday + QString birthday_str = restoreSeed.birthday->toPlainText(); + bool ok; + qint64 birthday = birthday_str.toUInt(&ok); + if (!ok) { + QMessageBox::warning(this, tr("Failed to parse wallet birthday"), + tr("Couldn't understand wallet birthday. This should be a block height from where to rescan the wallet. You can leave it as '0' if you don't know what it should be."), + QMessageBox::Ok); + return false; + } + + + QString number_str = restoreSeed.quantity->text(); + qint64 number = number_str.toUInt(); + + auto config = std::shared_ptr(new ConnectionConfig()); + config->server = Settings::getInstance()->getSettings().server; + // 3. Attempt to restore wallet with the seed phrase + { + char* resp = litelib_initialize_new_from_phrase(config->server.toStdString().c_str(), + seed.toStdString().c_str(), birthday, number); + QString reply = litelib_process_response(resp); + + if (reply.toUpper().trimmed() != "OK") { + QMessageBox::warning(this, tr("Failed to restore wallet"), + tr("Couldn't restore the wallet") + "\n" + reply, + QMessageBox::Ok); + + } + } + + // 4. Finally attempt to save the wallet + { + char* resp = litelib_execute("save", ""); + QString reply = litelib_process_response(resp); + + QByteArray ba_reply = reply.toUtf8(); + QJsonDocument jd_reply = QJsonDocument::fromJson(ba_reply); + QJsonObject parsed = jd_reply.object(); + + if (parsed.isEmpty() || parsed["result"].isNull()) { + QMessageBox::warning(this, tr("Failed to save wallet"), + tr("Couldn't save the wallet") + "\n" + reply, + QMessageBox::Ok); + + } else {} + + dialog.close(); + // To rescan, we clear the wallet state, and then reload the connection // This will start a sync, and show the scanning status. this->getRPC()->clearWallet([=] (auto) { // Save the wallet this->getRPC()->saveWallet([=] (auto) { // Then reload the connection. The ConnectionLoader deletes itself. - auto cl = new ConnectionLoader(this, rpc); + auto cl = new ConnectionLoader(this, rpc); cl->loadConnection(); - }); - }); - }); + }); + }); + + + } + + }); + + // }); + + dialog.exec(); +}); // Address Book QObject::connect(ui->action_Address_Book, &QAction::triggered, this, &MainWindow::addressBook); @@ -605,6 +718,30 @@ void MainWindow::setPassword(QString password) _password = password; } +QString MainWindow::getAmt() +{ + + return _amt; +} + +void MainWindow::setAmt(QString amt) +{ + + _amt = amt; +} + +QString MainWindow::getMoneyMemo() +{ + + return _moneymemo; +} + +void MainWindow::setMoneyMemo(QString moneymemo) +{ + + _moneymemo = moneymemo; +} + void MainWindow::setupStatusBar() { // Status Bar loadingLabel = new QLabel(); @@ -1338,6 +1475,11 @@ void MainWindow::setupchatTab() { } QObject::connect(ui->sendChatButton, &QPushButton::clicked, this, &MainWindow::sendChat); + QObject::connect(ui->sendChatButton, &QPushButton::clicked, [&] () { + + ui->memoTxtChat->setEnabled(false); + + }); QObject::connect(ui->safeContactRequest, &QPushButton::clicked, this, &MainWindow::addContact); QObject::connect(ui->pushContact, &QPushButton::clicked, this , &MainWindow::renderContactRequest); @@ -1361,6 +1503,8 @@ void MainWindow::setupchatTab() { ui->listChat->addAction(viewexplorer); ui->listChat->addAction(copytxid); + }); + QObject::connect(copymessage, &QAction::triggered, [=] { @@ -1453,7 +1597,7 @@ void MainWindow::setupchatTab() { } }); -}); + ///////// Add contextmenu QMenu* contextMenu; @@ -1463,10 +1607,8 @@ void MainWindow::setupchatTab() { QAction* requestHushAction; QAction* subatomicAction; contextMenu = new QMenu(ui->listContactWidget); - requestAction = new QAction("Send a contact request - coming soon",contextMenu); + HushAction = new QAction("Send or Request Hush ",contextMenu); editAction = new QAction("Delete this contact",contextMenu); - HushAction = new QAction("Send a friend some Hush - coming soon",contextMenu); - requestHushAction = new QAction("Request some Hush - coming soon",contextMenu); subatomicAction = new QAction("Make a subatomic swap with a friend- coming soon",contextMenu); @@ -1475,26 +1617,86 @@ void MainWindow::setupchatTab() { QObject::connect(ui->listContactWidget, &QTableView::clicked, [=] () { ui->listContactWidget->setContextMenuPolicy(Qt::ActionsContextMenu); - ui->listContactWidget->addAction(requestAction); - ui->listContactWidget->addAction(editAction); ui->listContactWidget->addAction(HushAction); - ui->listContactWidget->addAction(requestHushAction); + ui->listContactWidget->addAction(editAction); ui->listContactWidget->addAction(subatomicAction); ui->memoTxtChat->setEnabled(true); - /*QObject::connect(requestHushAction, &QAction::triggered, [=]() { QModelIndex index = ui->listContactWidget->currentIndex(); - QString label_contact = index.data(Qt::DisplayRole).toString(); + QString label_contact = index.data(Qt::DisplayRole).toString(); for(auto &p : AddressBook::getInstance()->getAllAddressLabels()) if (label_contact == p.getName()) { ui->contactNameMemo->setText(p.getName()); rpc->refresh(true); + + } + }); + + QObject::connect(HushAction, &QAction::triggered, [=]() { + + QModelIndex index = ui->listContactWidget->currentIndex(); + QString label_contact = index.data(Qt::DisplayRole).toString(); + + Ui_transactionHush transaction; + QDialog transactionDialog(this); + transaction.setupUi(&transactionDialog); + Settings::saveRestore(&transactionDialog); + // transaction.requestHush->setEnabled(false); + // transaction.requestHush->setVisible(false); + transaction.amountChat->setValidator(this->getAmountValidator()); + QString icon = ":icons/res/hush-money-white.png"; + QPixmap hush(icon); + transaction.label_3->setPixmap(hush); + + + + for(auto &p : AddressBook::getInstance()->getAllAddressLabels()) + if (label_contact == p.getName()) { + + QStandardItemModel* contact = new QStandardItemModel(); + QString avatar = p.getAvatar(); + QStandardItem* Items1 = new QStandardItem(p.getName()); + Items1->setData(QIcon(avatar),Qt::DecorationRole); + contact->appendRow(Items1); + transaction.contactName->setModel(contact); + transaction.contactName->setIconSize(QSize(60,70)); + transaction.contactName->setUniformItemSizes(true); + transaction.contactName->setDragDropMode(QAbstractItemView::DropOnly); + transaction.contactName->show(); + } - MainWindow::showRequesthush(); - - }); */ + + QObject::connect(transaction.sendHush, &QPushButton::clicked, [&] (){ + + QString amt = transaction.amountChat->text(); + QString memo = transaction.MemoMoney->text(); + this->setAmt(amt); + this->setMoneyMemo(memo); + transactionDialog.close(); + }); + + QObject::connect(transaction.sendHush, &QPushButton::clicked, this , &MainWindow::sendMoneyChat); + + + + QObject::connect(transaction.requestHush, &QPushButton::clicked, [&] (){ + + QString amt = transaction.amountChat->text(); + QString memo = transaction.MemoMoney->text(); + this->setAmt(amt); + this->setMoneyMemo(memo); + transactionDialog.close(); + }); + + QObject::connect(transaction.requestHush, &QPushButton::clicked, this , &MainWindow::sendMoneyRequestChat); + + + + transactionDialog.exec(); + + }); QObject::connect(editAction, &QAction::triggered, [=]() { QModelIndex index = ui->listContactWidget->currentIndex(); @@ -1517,21 +1719,579 @@ void MainWindow::setupchatTab() { } }); + + +ui->memoTxtChat->setLenDisplayLabelChat(ui->memoSizeChat); + +} + +// Create a Tx from the current state of the Chat page. +Tx MainWindow::createTxFromSendChatPage() { + Tx tx; + CAmount totalAmt; + // For each addr/amt in the Chat tab + { + + QString amtStr = this->getAmt(); + CAmount amt; + CAmount amtHm; + + amt = CAmount::fromDecimalString(amtStr); + amtHm = CAmount::fromDecimalString("0"); + totalAmt = totalAmt + amt; + QModelIndex index = ui->listContactWidget->currentIndex(); QString label_contact = index.data(Qt::DisplayRole).toString(); - - for(auto &p : AddressBook::getInstance()->getAllAddressLabels()) - if (label_contact == p.getName()) { - ui->contactNameMemo->setText(p.getName()); - rpc->refresh(true); + + for(auto &c : AddressBook::getInstance()->getAllAddressLabels()) + + if (label_contact == c.getName()) { + + QString cid = c.getCid(); + QString myAddr = c.getMyAddress(); + QString type = "Money"; + QString addr = c.getPartnerAddress(); + QString moneymemo = this->getMoneyMemo(); + + /////////User input for chatmemos + QString memoplain = QString("Money transaction of : ") + amtStr + QString(" HUSH") + QString("\n") + QString("\n") + moneymemo; + + /////////We convert the user input from QString to unsigned char*, so we can encrypt it later + int lengthmemo = memoplain.length(); + + char *memoplainchar = NULL; + memoplainchar = new char[lengthmemo+2]; + strncpy(memoplainchar, memoplain.toUtf8(), lengthmemo +1); + + QString pubkey = this->getPubkeyByAddress(addr); + QString passphraseHash = DataStore::getChatDataStore()->getPassword(); + int length = passphraseHash.length(); + + ////////////////Generate the secretkey for our message encryption + + char *hashEncryptionKeyraw = NULL; + hashEncryptionKeyraw = new char[length+1]; + strncpy(hashEncryptionKeyraw, passphraseHash.toUtf8(), length+1); + + #define MESSAGEAS1 ((const unsigned char *) hashEncryptionKeyraw) + #define MESSAGEAS1_LEN length + + + unsigned char sk[crypto_kx_SECRETKEYBYTES]; + unsigned char pk[crypto_kx_PUBLICKEYBYTES]; + unsigned char server_rx[crypto_kx_SESSIONKEYBYTES], server_tx[crypto_kx_SESSIONKEYBYTES]; + + if (crypto_kx_seed_keypair(pk,sk, + MESSAGEAS1) !=0) { + + this->logger->write("Suspicious keypair, bail out "); + } + ////////////////Get the pubkey from Bob, so we can create the share key + + const QByteArray pubkeyBobArray = QByteArray::fromHex(pubkey.toLatin1()); + const unsigned char *pubkeyBob = reinterpret_cast(pubkeyBobArray.constData()); + /////Create the shared key for sending the message + + if (crypto_kx_server_session_keys(server_rx, server_tx, + pk, sk, pubkeyBob) != 0) { + this->logger->write("Suspicious client public send key, bail out "); + } + + // Let's try to preserve Unicode characters + QByteArray ba_memo = memoplain.toUtf8(); + int ba_memo_length = ba_memo.size(); + + #define MESSAGEMoney (const unsigned char *) ba_memo.data() + #define MESSAGE_LENMoney ba_memo_length + + + ////////////Now lets encrypt the message Alice send to Bob////////////////////////////// + //#define MESSAGE (const unsigned char *) memoplainchar + //#define MESSAGE_LEN lengthmemo + #define CIPHERTEXT_LEN (crypto_secretstream_xchacha20poly1305_ABYTES + MESSAGE_LENMoney) + unsigned char ciphertext[CIPHERTEXT_LEN]; + unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES]; + + crypto_secretstream_xchacha20poly1305_state state; + + /* Set up a new stream: initialize the state and create the header */ + crypto_secretstream_xchacha20poly1305_init_push(&state, header, server_tx); + + + /* Now, encrypt the first chunk. `c1` will contain an encrypted, + * authenticated representation of `MESSAGE_PART1`. */ + crypto_secretstream_xchacha20poly1305_push + (&state, ciphertext, NULL, MESSAGEMoney, MESSAGE_LENMoney, NULL, 0, crypto_secretstream_xchacha20poly1305_TAG_FINAL); + + ////Create the HM for this message + QString headerbytes = QByteArray(reinterpret_cast(header), crypto_secretstream_xchacha20poly1305_HEADERBYTES).toHex(); + QString publickeyAlice = QByteArray(reinterpret_cast(pk), crypto_kx_PUBLICKEYBYTES).toHex(); + + + QString hmemo= createHeaderMemo(type,cid,myAddr,headerbytes,publickeyAlice,1,0); + + /////Ciphertext Memo + QString memo = QByteArray(reinterpret_cast(ciphertext), CIPHERTEXT_LEN).toHex(); + + + tx.toAddrs.push_back(ToFields{addr, amtHm, hmemo}); + tx.toAddrs.push_back(ToFields{addr, amt, memo}); + + } + } + + tx.fee = Settings::getMinerFee(); + + return tx; + +} + +void MainWindow::sendMoneyChat() { + +////////////////////////////Todo: Check if a Contact is selected////////// + + // Create a Tx from the values on the send tab. Note that this Tx object + // might not be valid yet. + + /* QString Name = ui->contactNameMemo->text(); + + if ((ui->contactNameMemo->text().isEmpty()) || (ui->memoTxtChat->toPlainText().trimmed().isEmpty())) { + + QMessageBox msg(QMessageBox::Critical, tr("You have to select a contact and insert a Memo"), + tr("You have selected no Contact from Contactlist,\n") + tr("\nor your Memo is empty"), + QMessageBox::Ok, this); + + msg.exec(); + return; + }*/ + + + Tx tx = createTxFromSendChatPage(); + + QString error = doSendChatMoneyTxValidations(tx); + + if (!error.isEmpty()) { + // Something went wrong, so show an error and exit + QMessageBox msg(QMessageBox::Critical, tr("Message Error"), error, + QMessageBox::Ok, this); + + msg.exec(); + ui->memoTxtChat->setEnabled(true); + + // abort the Tx + return; + } + + auto movie = new QMovie(this); + auto movie1 = new QMovie(this); + movie->setFileName(":/img/res/loaderblack.gif"); + movie1->setFileName(":/img/res/loaderwhite.gif"); + + auto theme = Settings::getInstance()->get_theme_name(); + if (theme == "Dark" || theme == "Midnight") { + + connect(movie, &QMovie::frameChanged, [=]{ + ui->sendChatButton->setIcon(movie->currentPixmap()); + }); + movie->start(); + ui->sendChatButton->show(); + ui->sendChatButton->setEnabled(false); + + } else { + + connect(movie1, &QMovie::frameChanged, [=]{ + ui->sendChatButton->setIcon(movie1->currentPixmap()); + }); + movie1->start(); + ui->sendChatButton->show(); + ui->sendChatButton->setEnabled(false); + ui->memoTxtChat->setEnabled(false); } - }); + + ui->memoTxtChat->clear(); + + // And send the Tx + rpc->executeTransaction(tx, + [=] (QString txid) { + ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); + + + QTimer::singleShot(1000, [=]() { + + if (theme == "Dark" || theme == "Midnight") { + QPixmap send(":/icons/res/send-white.png"); + QIcon sendIcon(send); + ui->sendChatButton->setIcon(sendIcon); + movie->stop(); + ui->sendChatButton->setEnabled(true); + ui->memoTxtChat->setEnabled(true); + }else{ + + QPixmap send(":/icons/res/sendBlack.png"); + QIcon sendIcon(send); + ui->sendChatButton->setIcon(sendIcon); + movie1->stop(); + ui->sendChatButton->setEnabled(true); + ui->memoTxtChat->setEnabled(true); + } + + }); + + // Force a UI update so we get the unconfirmed Tx + rpc->refresh(true); + ui->memoTxtChat->clear(); + // ui->memoTxtChat->setEnabled(true); + + }, + // Errored out + [=] (QString opid, QString errStr) { + ui->statusBar->showMessage(QObject::tr(" Tx ") % opid % QObject::tr(" failed"), 15 * 1000); + ui->memoTxtChat->setEnabled(true); + + if (!opid.isEmpty()) + errStr = QObject::tr("The transaction with id ") % opid % QObject::tr(" failed. The error was") + ":\n\n" + errStr; + + QMessageBox::critical(this, QObject::tr("Transaction Error"), errStr, QMessageBox::Ok); + movie->stop(); + ui->memoTxtChat->setEnabled(true); + + + if (theme == "Dark" || theme == "Midnight") { + QPixmap send(":/icons/res/send-white.png"); + QIcon sendIcon(send); + ui->sendChatButton->setIcon(sendIcon); + movie->stop(); + ui->sendChatButton->setEnabled(true); + ui->memoTxtChat->setEnabled(true); + }else{ + + QPixmap send(":/icons/res/sendBlack.png"); + QIcon sendIcon(send); + ui->sendChatButton->setIcon(sendIcon); + movie1->stop(); + ui->sendChatButton->setEnabled(true); + ui->memoTxtChat->setEnabled(true); + } + + + } + ); + + } + +QString MainWindow::doSendChatMoneyTxValidations(Tx tx) { + // Check to see if we have enough verified funds to send the Tx. + + CAmount total; + for (auto toAddr : tx.toAddrs) { + if (!Settings::isValidAddress(toAddr.addr)) { + QString addr = (toAddr.addr.length() > 100 ? toAddr.addr.left(100) + "..." : toAddr.addr); + return QString(tr("Recipient Address ")) % addr % tr(" is Invalid"); + ui->memoTxtChat->setEnabled(true); + } + + // This technically shouldn't be possible, but issue #62 seems to have discovered a bug + // somewhere, so just add a check to make sure. + if (toAddr.amount.toqint64() < 0) { + return QString(tr("Amount for address '%1' is invalid!").arg(toAddr.addr)); + ui->memoTxtChat->setEnabled(true); + } + + total = total + toAddr.amount; + } + total = total + tx.fee; + + auto available = rpc->getModel()->getAvailableBalance(); + + if (available < total) { + return tr("Not enough available funds to send this transaction\n\nHave: %1\nNeed: %2\n\nNote: Funds need 1 confirmations before they can be spent") + .arg(available.toDecimalhushString(), total.toDecimalhushString()); + ui->memoTxtChat->setEnabled(true); + + } + + return ""; +} + +// Create a Tx from the current state of the Chat page. +Tx MainWindow::createTxFromSendRequestChatPage() { + Tx tx; + CAmount totalAmt; + // For each addr/amt in the Chat tab + { + + QString amtStr = this->getAmt(); + CAmount amt; + CAmount amtHm; + + amt = CAmount::fromDecimalString("0"); + amtHm = CAmount::fromDecimalString("0"); + totalAmt = totalAmt + amt; + + QModelIndex index = ui->listContactWidget->currentIndex(); + QString label_contact = index.data(Qt::DisplayRole).toString(); + + for(auto &c : AddressBook::getInstance()->getAllAddressLabels()) + + if (label_contact == c.getName()) { + + QString cid = c.getCid(); + QString myAddr = c.getMyAddress(); + QString type = "Money"; + QString addr = c.getPartnerAddress(); + QString moneymemo = this->getMoneyMemo(); + + /////////User input for chatmemos + QString memoplain = QString("Request of : ") + amtStr + QString(" HUSH ") + QString("\n") + QString("\n") + moneymemo; + + /////////We convert the user input from QString to unsigned char*, so we can encrypt it later + int lengthmemo = memoplain.length(); + + char *memoplainchar = NULL; + memoplainchar = new char[lengthmemo+2]; + strncpy(memoplainchar, memoplain.toUtf8(), lengthmemo +1); + + QString pubkey = this->getPubkeyByAddress(addr); + QString passphraseHash = DataStore::getChatDataStore()->getPassword(); + int length = passphraseHash.length(); + + ////////////////Generate the secretkey for our message encryption + + char *hashEncryptionKeyraw = NULL; + hashEncryptionKeyraw = new char[length+1]; + strncpy(hashEncryptionKeyraw, passphraseHash.toUtf8(), length+1); + + #define MESSAGEAS1 ((const unsigned char *) hashEncryptionKeyraw) + #define MESSAGEAS1_LEN length + + + unsigned char sk[crypto_kx_SECRETKEYBYTES]; + unsigned char pk[crypto_kx_PUBLICKEYBYTES]; + unsigned char server_rx[crypto_kx_SESSIONKEYBYTES], server_tx[crypto_kx_SESSIONKEYBYTES]; + + if (crypto_kx_seed_keypair(pk,sk, + MESSAGEAS1) !=0) { + + this->logger->write("Suspicious keypair, bail out "); + } + ////////////////Get the pubkey from Bob, so we can create the share key + + const QByteArray pubkeyBobArray = QByteArray::fromHex(pubkey.toLatin1()); + const unsigned char *pubkeyBob = reinterpret_cast(pubkeyBobArray.constData()); + /////Create the shared key for sending the message + + if (crypto_kx_server_session_keys(server_rx, server_tx, + pk, sk, pubkeyBob) != 0) { + this->logger->write("Suspicious client public send key, bail out "); + } + + + // Let's try to preserve Unicode characters + QByteArray ba_memo = memoplain.toUtf8(); + int ba_memo_length = ba_memo.size(); + + #define MESSAGEMoney (const unsigned char *) ba_memo.data() + #define MESSAGE_LENMoney ba_memo_length + + + ////////////Now lets encrypt the message Alice send to Bob////////////////////////////// + //#define MESSAGE (const unsigned char *) memoplainchar + //#define MESSAGE_LEN lengthmemo + #define CIPHERTEXT_LEN (crypto_secretstream_xchacha20poly1305_ABYTES + MESSAGE_LENMoney) + unsigned char ciphertext[CIPHERTEXT_LEN]; + unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES]; + + crypto_secretstream_xchacha20poly1305_state state; + + /* Set up a new stream: initialize the state and create the header */ + crypto_secretstream_xchacha20poly1305_init_push(&state, header, server_tx); + + + /* Now, encrypt the first chunk. `c1` will contain an encrypted, + * authenticated representation of `MESSAGE_PART1`. */ + crypto_secretstream_xchacha20poly1305_push + (&state, ciphertext, NULL, MESSAGEMoney, MESSAGE_LENMoney, NULL, 0, crypto_secretstream_xchacha20poly1305_TAG_FINAL); + + ////Create the HM for this message + QString headerbytes = QByteArray(reinterpret_cast(header), crypto_secretstream_xchacha20poly1305_HEADERBYTES).toHex(); + QString publickeyAlice = QByteArray(reinterpret_cast(pk), crypto_kx_PUBLICKEYBYTES).toHex(); + + + QString hmemo= createHeaderMemo(type,cid,myAddr,headerbytes,publickeyAlice,1,0); + + /////Ciphertext Memo + QString memo = QByteArray(reinterpret_cast(ciphertext), CIPHERTEXT_LEN).toHex(); + -ui->memoTxtChat->setLenDisplayLabelChat(ui->memoSizeChat); + tx.toAddrs.push_back(ToFields{addr, amtHm, hmemo}); + tx.toAddrs.push_back(ToFields{addr, amt, memo}); + + } + } + + tx.fee = Settings::getMinerFee(); + + return tx; } +void MainWindow::sendMoneyRequestChat() { + +////////////////////////////Todo: Check if a Contact is selected////////// + + // Create a Tx from the values on the send tab. Note that this Tx object + // might not be valid yet. + + /* QString Name = ui->contactNameMemo->text(); + + if ((ui->contactNameMemo->text().isEmpty()) || (ui->memoTxtChat->toPlainText().trimmed().isEmpty())) { + + QMessageBox msg(QMessageBox::Critical, tr("You have to select a contact and insert a Memo"), + tr("You have selected no Contact from Contactlist,\n") + tr("\nor your Memo is empty"), + QMessageBox::Ok, this); + + msg.exec(); + return; + }*/ + + + Tx tx = createTxFromSendRequestChatPage(); + + QString error = doSendChatMoneyRequestTxValidations(tx); + + if (!error.isEmpty()) { + // Something went wrong, so show an error and exit + QMessageBox msg(QMessageBox::Critical, tr("Message Error"), error, + QMessageBox::Ok, this); + + msg.exec(); + + // abort the Tx + return; + } + + auto movie = new QMovie(this); + auto movie1 = new QMovie(this); + movie->setFileName(":/img/res/loaderblack.gif"); + movie1->setFileName(":/img/res/loaderwhite.gif"); + + auto theme = Settings::getInstance()->get_theme_name(); + if (theme == "Dark" || theme == "Midnight") { + + connect(movie, &QMovie::frameChanged, [=]{ + ui->sendChatButton->setIcon(movie->currentPixmap()); + }); + movie->start(); + ui->sendChatButton->show(); + ui->sendChatButton->setEnabled(false); + + } else { + + connect(movie1, &QMovie::frameChanged, [=]{ + ui->sendChatButton->setIcon(movie1->currentPixmap()); + }); + movie1->start(); + ui->sendChatButton->show(); + ui->sendChatButton->setEnabled(false); + } + + ui->memoTxtChat->clear(); + + // And send the Tx + rpc->executeTransaction(tx, + [=] (QString txid) { + ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); + + + QTimer::singleShot(1000, [=]() { + + if (theme == "Dark" || theme == "Midnight") { + QPixmap send(":/icons/res/send-white.png"); + QIcon sendIcon(send); + ui->sendChatButton->setIcon(sendIcon); + movie->stop(); + ui->sendChatButton->setEnabled(true); + }else{ + + QPixmap send(":/icons/res/sendBlack.png"); + QIcon sendIcon(send); + ui->sendChatButton->setIcon(sendIcon); + movie1->stop(); + ui->sendChatButton->setEnabled(true); + } + + }); + + // Force a UI update so we get the unconfirmed Tx + rpc->refresh(true); + ui->memoTxtChat->clear(); + + }, + // Errored out + [=] (QString opid, QString errStr) { + ui->statusBar->showMessage(QObject::tr(" Tx ") % opid % QObject::tr(" failed"), 15 * 1000); + + if (!opid.isEmpty()) + errStr = QObject::tr("The transaction with id ") % opid % QObject::tr(" failed. The error was") + ":\n\n" + errStr; + + QMessageBox::critical(this, QObject::tr("Transaction Error"), errStr, QMessageBox::Ok); + movie->stop(); + + + if (theme == "Dark" || theme == "Midnight") { + QPixmap send(":/icons/res/send-white.png"); + QIcon sendIcon(send); + ui->sendChatButton->setIcon(sendIcon); + movie->stop(); + ui->sendChatButton->setEnabled(true); + }else{ + + QPixmap send(":/icons/res/sendBlack.png"); + QIcon sendIcon(send); + ui->sendChatButton->setIcon(sendIcon); + movie1->stop(); + ui->sendChatButton->setEnabled(true); + } + + + + } + ); + + } + +QString MainWindow::doSendChatMoneyRequestTxValidations(Tx tx) { + // Check to see if we have enough verified funds to send the Tx. + + CAmount total; + for (auto toAddr : tx.toAddrs) { + if (!Settings::isValidAddress(toAddr.addr)) { + QString addr = (toAddr.addr.length() > 100 ? toAddr.addr.left(100) + "..." : toAddr.addr); + return QString(tr("Recipient Address ")) % addr % tr(" is Invalid"); + } + + // This technically shouldn't be possible, but issue #62 seems to have discovered a bug + // somewhere, so just add a check to make sure. + if (toAddr.amount.toqint64() < 0) { + return QString(tr("Amount for address '%1' is invalid!").arg(toAddr.addr)); + } + + total = total + toAddr.amount; + } + total = total + tx.fee; + + auto available = rpc->getModel()->getAvailableBalance(); + + if (available < total) { + return tr("Not enough available funds to send this transaction\n\nHave: %1\nNeed: %2\n\nNote: Funds need 1 confirmations before they can be spent") + .arg(available.toDecimalhushString(), total.toDecimalhushString()); + } + + return ""; +} + + void MainWindow::updateChat() { rpc->refreshChat(ui->listChat,ui->memoSizeChat); @@ -1981,3 +2741,125 @@ void MainWindow::on_givemeZaddr_clicked() }); } + +void MainWindow::on_emojiButton_clicked() +{ + + QDialog emojiDialog(this); + Ui_emojiDialog emoji; + emoji.setupUi(&emojiDialog); + Settings::saveRestore(&emojiDialog); + +QObject::connect(emoji.smiley, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":smiley:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.money, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":money_mouth:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.laughing, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":laughing:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.sweet_smile, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":sweet_smile:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.joy, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":joy:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.innocent, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":innocent:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.partying_face, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":partying_face:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.rolling_eyes, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":rolling_eyes:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.tongue, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":stuck_out_tongue:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.hearts3, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":face_with_3hearts:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.heart_eyes, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":heart_eyes:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.nauseated, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":nauseated:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.poop, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":poop:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.symbols_mouth, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":symbols_mouth:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.sunglass, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":sunglass:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.stuck_out, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":stuck_out:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.hush_white, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":hush_white:"); + + emojiDialog.close(); +}); + +QObject::connect(emoji.sd, &QPushButton::clicked, [&] () { + ui->memoTxtChat->insertHtml(":sd:"); + + emojiDialog.close(); +}); + + + + emojiDialog.exec(); +} + diff --git a/src/mainwindow.h b/src/mainwindow.h index 3550b5a..ac77d8b 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -49,12 +49,18 @@ public: QString doSendTxValidations(Tx tx); QString doSendChatTxValidations(Tx tx); + QString doSendChatMoneyTxValidations(Tx tx); QString doSendRequestTxValidations(Tx tx); + QString doSendChatMoneyRequestTxValidations(Tx tx); QString getCid(); + QString getAmt(); + QString getMoneyMemo(); QString getPassword(); std::map pubkeyMap; QString getPubkeyByAddress(QString requestZaddr); void setPassword(QString Password); + void setAmt(QString Amt); + void setMoneyMemo(QString MoneyMemo); void addPubkey(QString requestZaddr, QString pubkey); @@ -105,12 +111,15 @@ private slots: void on_givemeZaddr_clicked(); + void on_emojiButton_clicked(); private: bool fileExists(QString path); void closeEvent(QCloseEvent* event); void closeEventpw(QCloseEvent* event); QString _password; + QString _amt; + QString _moneymemo; void setupSendTab(); @@ -135,7 +144,8 @@ private: Tx createTxFromChatPage(); Tx createTxForSafeContactRequest(); - + Tx createTxFromSendChatPage(); + Tx createTxFromSendRequestChatPage(); void encryptWallet(); void removeWalletEncryption(); @@ -144,6 +154,8 @@ private: void cancelButton(); void sendButton(); void sendChat(); + void sendMoneyChat(); + void sendMoneyRequestChat(); void addContact(); void ContactRequest(); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index f771bc4..4e62995 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -6,7 +6,7 @@ 0 0 - 1274 + 1308 779 @@ -59,7 +59,7 @@ - 5 + 0 @@ -428,7 +428,7 @@ 0 0 - 1226 + 1260 509 @@ -1341,8 +1341,8 @@ HushChat - - + + @@ -1546,7 +1546,7 @@ - + QLayout::SetDefaultConstraint @@ -1683,6 +1683,12 @@ 0 + + + 850 + 0 + + false @@ -1706,9 +1712,48 @@ + + + + + 20 + 0 + + + + + + + + :/emoji/res/emoji/emoji1.png + + + + + 17 + 17 + + + + true + + + - + + 6 + + + 6 + + + 6 + + + 6 + + @@ -1716,6 +1761,12 @@ 0 + + + 16777215 + 50 + + 100 @@ -1747,7 +1798,7 @@ - + @@ -1783,7 +1834,7 @@ 0 0 - 1274 + 1308 22 diff --git a/src/restoreSeed.ui b/src/restoreSeed.ui new file mode 100644 index 0000000..fb923db --- /dev/null +++ b/src/restoreSeed.ui @@ -0,0 +1,72 @@ + + + + + Dialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + + diff --git a/src/scripts/mkrelease.sh b/src/scripts/mkrelease.sh index 15e22ac..1a965df 100755 --- a/src/scripts/mkrelease.sh +++ b/src/scripts/mkrelease.sh @@ -35,6 +35,15 @@ rm -rf bin/SilentDragonLite* > /dev/null # Build the lib first cd lib && make release && cd .. make -j$(nproc) > /dev/null +make install INSTALL_ROOT=AppDir + +# now, build AppImage using linuxdeploy and linuxdeploy-plugin-qt +# download linuxdeploy and its Qt plugin +wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage +wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage + +# make them executable +chmod +x linuxdeploy*.AppImage echo "[OK]" diff --git a/src/seedrestore.ui b/src/seedrestore.ui new file mode 100644 index 0000000..697c2c2 --- /dev/null +++ b/src/seedrestore.ui @@ -0,0 +1,114 @@ + + + Restore + + + + 0 + 0 + 637 + 429 + + + + Restore your Wallet + + + + + + + 0 + 284 + + + + + + + + + + Birthday : + + + + + + + Quantity : + + + + + + + + + + + + 529 + 0 + + + + + 16777215 + 25 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + + + + + + 529 + 0 + + + + + + + + + + + + + Qt::Horizontal + + + + 521 + 20 + + + + + + + + + 89 + 16777215 + + + + Restore + + + + + + + + diff --git a/src/sendHushTransactionChat.ui b/src/sendHushTransactionChat.ui new file mode 100644 index 0000000..94bc851 --- /dev/null +++ b/src/sendHushTransactionChat.ui @@ -0,0 +1,276 @@ + + + transactionHush + + + + 0 + 0 + 212 + 405 + + + + Send or Request Hush + + + + + + To : + + + + + + + QLayout::SetFixedSize + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + 16777215 + 70 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + QAbstractItemView::NoEditTriggers + + + false + + + + + + + + + QLayout::SetFixedSize + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + 80 + 16777215 + + + + Amount: + + + + + + + + 80 + 16777215 + + + + + 200 + 0 + + + + 9 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Amount + + + + + + + + 35 + 16777215 + + + + Hush + + + + + + + + + Memo : + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 41 + + + + + 16777215 + 41 + + + + 100 + + + + + + + Qt::Vertical + + + + 20 + 39 + + + + + + + + QLayout::SetFixedSize + + + 6 + + + 6 + + + 6 + + + 6 + + + + + Request Hush + + + + + + + + 16777215 + 25 + + + + Send Hush + + + + + + + + + QLayout::SetFixedSize + + + 6 + + + 6 + + + 6 + + + 6 + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel + + + + + + + + + + + buttonBox + rejected() + transactionHush + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/version.h b/src/version.h index fa69420..06e80b4 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define APP_VERSION "1.3.6" +#define APP_VERSION "1.3.8"