mirror of
https://github.com/pumpbin/pumpbin
synced 2026-03-14 23:04:30 -07:00
feat(ui): restore message after 3 secs
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -2251,6 +2251,7 @@ dependencies = [
|
|||||||
"open",
|
"open",
|
||||||
"rand",
|
"rand",
|
||||||
"rfd",
|
"rfd",
|
||||||
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ anyhow = "1.0.86"
|
|||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
memchr = "2.7.4"
|
memchr = "2.7.4"
|
||||||
aes-gcm = "0.10.3"
|
aes-gcm = "0.10.3"
|
||||||
|
tokio = { version = "1.38.0", default-features = false , features = ["time"]}
|
||||||
|
|
||||||
[dependencies.iced]
|
[dependencies.iced]
|
||||||
version = "0.13.0-dev"
|
version = "0.13.0-dev"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use std::{fs, path::PathBuf, usize};
|
use std::{fs, path::PathBuf, time::Duration, usize};
|
||||||
|
|
||||||
use dirs::{desktop_dir, home_dir};
|
use dirs::{desktop_dir, home_dir};
|
||||||
use iced::{
|
use iced::{
|
||||||
@@ -66,6 +66,14 @@ impl Default for Maker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Maker {
|
impl Maker {
|
||||||
|
fn show_message(&mut self, message: String) -> Task<MakerMessage> {
|
||||||
|
self.message = message;
|
||||||
|
let wait = async {
|
||||||
|
tokio::time::sleep(Duration::from_secs(3)).await;
|
||||||
|
};
|
||||||
|
Task::perform(wait, MakerMessage::ClearMessage)
|
||||||
|
}
|
||||||
|
|
||||||
fn plugin_name(&self) -> &str {
|
fn plugin_name(&self) -> &str {
|
||||||
&self.plugin_name
|
&self.plugin_name
|
||||||
}
|
}
|
||||||
@@ -181,6 +189,7 @@ enum MakerMessage {
|
|||||||
B1nClicked,
|
B1nClicked,
|
||||||
GithubClicked,
|
GithubClicked,
|
||||||
ThemeChanged(Theme),
|
ThemeChanged(Theme),
|
||||||
|
ClearMessage(()),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Application for Maker {
|
impl Application for Maker {
|
||||||
@@ -281,19 +290,16 @@ impl Application for Maker {
|
|||||||
}
|
}
|
||||||
MakerMessage::GenerateClicked => {
|
MakerMessage::GenerateClicked => {
|
||||||
if self.plugin_name().is_empty() {
|
if self.plugin_name().is_empty() {
|
||||||
self.message = "Plugin Name is empty.".to_string();
|
return self.show_message("Plugin Name is empty.".to_string());
|
||||||
return Task::none();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.prefix().is_empty() {
|
if self.prefix().is_empty() {
|
||||||
self.message = "Prefix is empty.".to_string();
|
return self.show_message("Prefix is empty.".to_string());
|
||||||
return Task::none();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let ShellcodeSaveType::Local = self.shellcode_save_type() {
|
if let ShellcodeSaveType::Local = self.shellcode_save_type() {
|
||||||
if self.size_holder().is_empty() {
|
if self.size_holder().is_empty() {
|
||||||
self.message = "Size Holder is empty.".to_string();
|
return self.show_message("Size Holder is empty.".to_string());
|
||||||
return Task::none();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,25 +308,21 @@ impl Application for Maker {
|
|||||||
if let Ok(max) = self.max_len().parse::<usize>() {
|
if let Ok(max) = self.max_len().parse::<usize>() {
|
||||||
max_len = max;
|
max_len = max;
|
||||||
} else {
|
} else {
|
||||||
self.message = "MaxLen numeric only.".to_string();
|
return self.show_message("MaxLen numeric only.".to_string());
|
||||||
return Task::none();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
match self.encrypt_type() {
|
match self.encrypt_type() {
|
||||||
EncryptType::None => (),
|
EncryptType::None => (),
|
||||||
EncryptType::Xor(x) => {
|
EncryptType::Xor(x) => {
|
||||||
if x.is_empty() {
|
if x.is_empty() {
|
||||||
self.message = "Xor Pass is empty.".to_string();
|
return self.show_message("Xor Pass is empty.".to_string());
|
||||||
return Task::none();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EncryptType::AesGcm(x) => {
|
EncryptType::AesGcm(x) => {
|
||||||
if x.key_holder().is_empty() {
|
if x.key_holder().is_empty() {
|
||||||
self.message = "AesGcm Key is empty.".to_string();
|
return self.show_message("AesGcm Key is empty.".to_string());
|
||||||
return Task::none();
|
|
||||||
} else if x.nonce_holder().is_empty() {
|
} else if x.nonce_holder().is_empty() {
|
||||||
self.message = "AesGcm Nonce is empty.".to_string();
|
return self.show_message("AesGcm Nonce is empty.".to_string());
|
||||||
return Task::none();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -436,14 +438,10 @@ impl Application for Maker {
|
|||||||
|
|
||||||
Task::perform(make_plugin, MakerMessage::GenerateDone)
|
Task::perform(make_plugin, MakerMessage::GenerateDone)
|
||||||
}
|
}
|
||||||
MakerMessage::GenerateDone(x) => {
|
MakerMessage::GenerateDone(x) => self.show_message(match x {
|
||||||
self.message = match x {
|
|
||||||
Ok(_) => "Generate done.".to_string(),
|
Ok(_) => "Generate done.".to_string(),
|
||||||
Err(e) => e,
|
Err(e) => e,
|
||||||
};
|
}),
|
||||||
|
|
||||||
Task::none()
|
|
||||||
}
|
|
||||||
MakerMessage::ChooseFileClicked(x) => {
|
MakerMessage::ChooseFileClicked(x) => {
|
||||||
let choose_file = async move {
|
let choose_file = async move {
|
||||||
AsyncFileDialog::new()
|
AsyncFileDialog::new()
|
||||||
@@ -470,54 +468,54 @@ impl Application for Maker {
|
|||||||
MakerMessage::WindowsExeChooseDone(x) => {
|
MakerMessage::WindowsExeChooseDone(x) => {
|
||||||
match x {
|
match x {
|
||||||
Ok(x) => self.windows_exe = x,
|
Ok(x) => self.windows_exe = x,
|
||||||
Err(x) => self.message = x,
|
Err(x) => return self.show_message(x),
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
MakerMessage::WindowsLibChooseDone(x) => {
|
MakerMessage::WindowsLibChooseDone(x) => {
|
||||||
match x {
|
match x {
|
||||||
Ok(x) => self.windows_lib = x,
|
Ok(x) => self.windows_lib = x,
|
||||||
Err(x) => self.message = x,
|
Err(x) => return self.show_message(x),
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
MakerMessage::LinuxExeChooseDone(x) => {
|
MakerMessage::LinuxExeChooseDone(x) => {
|
||||||
match x {
|
match x {
|
||||||
Ok(x) => self.linux_exe = x,
|
Ok(x) => self.linux_exe = x,
|
||||||
Err(x) => self.message = x,
|
Err(x) => return self.show_message(x),
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
MakerMessage::LinuxLibChooseDone(x) => {
|
MakerMessage::LinuxLibChooseDone(x) => {
|
||||||
match x {
|
match x {
|
||||||
Ok(x) => self.linux_lib = x,
|
Ok(x) => self.linux_lib = x,
|
||||||
Err(x) => self.message = x,
|
Err(x) => return self.show_message(x),
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
MakerMessage::DarwinExeChooseDone(x) => {
|
MakerMessage::DarwinExeChooseDone(x) => {
|
||||||
match x {
|
match x {
|
||||||
Ok(x) => self.darwin_exe = x,
|
Ok(x) => self.darwin_exe = x,
|
||||||
Err(x) => self.message = x,
|
Err(x) => return self.show_message(x),
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
MakerMessage::DarwinLibChooseDone(x) => {
|
MakerMessage::DarwinLibChooseDone(x) => {
|
||||||
match x {
|
match x {
|
||||||
Ok(x) => self.darwin_lib = x,
|
Ok(x) => self.darwin_lib = x,
|
||||||
Err(x) => self.message = x,
|
Err(x) => return self.show_message(x),
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
MakerMessage::B1nClicked => {
|
MakerMessage::B1nClicked => {
|
||||||
if open::that(env!("CARGO_PKG_HOMEPAGE")).is_err() {
|
if open::that(env!("CARGO_PKG_HOMEPAGE")).is_err() {
|
||||||
self.message = "Open home failed.".into();
|
return self.show_message("Open home failed.".into());
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
MakerMessage::GithubClicked => {
|
MakerMessage::GithubClicked => {
|
||||||
if open::that(env!("CARGO_PKG_REPOSITORY")).is_err() {
|
if open::that(env!("CARGO_PKG_REPOSITORY")).is_err() {
|
||||||
self.message = "Open repo failed.".into();
|
return self.show_message("Open repo failed.".into());
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
@@ -525,6 +523,10 @@ impl Application for Maker {
|
|||||||
self.selected_theme = x;
|
self.selected_theme = x;
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
|
MakerMessage::ClearMessage(_) => {
|
||||||
|
self.message = "Welcom to PumpBin Maker.".to_string();
|
||||||
|
Task::none()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -757,7 +759,7 @@ impl Application for Maker {
|
|||||||
.width(Length::FillPortion(1))
|
.width(Length::FillPortion(1))
|
||||||
.align_items(Alignment::Start),
|
.align_items(Alignment::Start),
|
||||||
column![row![b1n, github].align_items(Alignment::Center)]
|
column![row![b1n, github].align_items(Alignment::Center)]
|
||||||
.width(Length::FillPortion(1))
|
.width(Length::Shrink)
|
||||||
.align_items(Alignment::Center),
|
.align_items(Alignment::Center),
|
||||||
column![theme_list]
|
column![theme_list]
|
||||||
.width(Length::FillPortion(1))
|
.width(Length::FillPortion(1))
|
||||||
|
|||||||
71
src/lib.rs
71
src/lib.rs
@@ -2,7 +2,7 @@ mod button_style;
|
|||||||
pub mod plugin;
|
pub mod plugin;
|
||||||
pub mod svg_style;
|
pub mod svg_style;
|
||||||
|
|
||||||
use std::{fmt::Display, fs, iter, ops::Not, path::PathBuf};
|
use std::{fmt::Display, fs, iter, ops::Not, path::PathBuf, time::Duration};
|
||||||
|
|
||||||
use dirs::{desktop_dir, home_dir};
|
use dirs::{desktop_dir, home_dir};
|
||||||
use iced::{
|
use iced::{
|
||||||
@@ -109,8 +109,12 @@ impl Pumpbin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn show_message(&mut self, message: String) {
|
fn show_message(&mut self, message: String) -> Task<Message> {
|
||||||
self.message = message;
|
self.message = message;
|
||||||
|
let wait = async {
|
||||||
|
tokio::time::sleep(Duration::from_secs(3)).await;
|
||||||
|
};
|
||||||
|
Task::perform(wait, Message::ClearMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn shellcode_src(&self) -> &str {
|
pub fn shellcode_src(&self) -> &str {
|
||||||
@@ -182,6 +186,7 @@ pub enum Message {
|
|||||||
B1nClicked,
|
B1nClicked,
|
||||||
GithubClicked,
|
GithubClicked,
|
||||||
ThemeChanged(Theme),
|
ThemeChanged(Theme),
|
||||||
|
ClearMessage(()),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
@@ -274,7 +279,7 @@ impl Application for Pumpbin {
|
|||||||
if let Some(path) = x {
|
if let Some(path) = x {
|
||||||
self.shellcode_src = path.to_string_lossy().to_string();
|
self.shellcode_src = path.to_string_lossy().to_string();
|
||||||
} else {
|
} else {
|
||||||
self.show_message("Canceled shellcode selection.".into())
|
return self.show_message("Canceled shellcode selection.".into());
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
@@ -355,28 +360,21 @@ impl Application for Pumpbin {
|
|||||||
};
|
};
|
||||||
Task::perform(write_encrypted, Message::EncryptShellcodeDone)
|
Task::perform(write_encrypted, Message::EncryptShellcodeDone)
|
||||||
} else {
|
} else {
|
||||||
self.show_message("Canceled shellcode selection.".into());
|
self.show_message("Canceled shellcode selection.".into())
|
||||||
Task::none()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Message::EncryptShellcodeDone(x) => {
|
Message::EncryptShellcodeDone(x) => self.show_message(match x {
|
||||||
self.show_message(match x {
|
|
||||||
Ok(_) => "Saved encrypted shellcode.".into(),
|
Ok(_) => "Saved encrypted shellcode.".into(),
|
||||||
Err(e) => e,
|
Err(e) => e,
|
||||||
});
|
}),
|
||||||
|
|
||||||
Task::none()
|
|
||||||
}
|
|
||||||
Message::GenerateClicked => {
|
Message::GenerateClicked => {
|
||||||
// verify path if local mode
|
// verify path if local mode
|
||||||
let path = PathBuf::from(self.shellcode_src());
|
let path = PathBuf::from(self.shellcode_src());
|
||||||
if self.shellcode_save_type() == ShellcodeSaveType::Local {
|
if self.shellcode_save_type() == ShellcodeSaveType::Local {
|
||||||
if path.exists().not() {
|
if path.exists().not() {
|
||||||
self.show_message("Shellcode path not exists.".into());
|
return self.show_message("Shellcode path not exists.".into());
|
||||||
return Task::none();
|
|
||||||
} else if path.is_file().not() {
|
} else if path.is_file().not() {
|
||||||
self.show_message("Shellcode path is not a file.".into());
|
return self.show_message("Shellcode path is not a file.".into());
|
||||||
return Task::none();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -546,14 +544,10 @@ impl Application for Pumpbin {
|
|||||||
|
|
||||||
Task::perform(generate, Message::GenerateDone)
|
Task::perform(generate, Message::GenerateDone)
|
||||||
}
|
}
|
||||||
Message::GenerateDone(x) => {
|
Message::GenerateDone(x) => self.show_message(match x {
|
||||||
self.show_message(match x {
|
|
||||||
Ok(_) => "Saved generated binary.".into(),
|
Ok(_) => "Saved generated binary.".into(),
|
||||||
Err(e) => e,
|
Err(e) => e,
|
||||||
});
|
}),
|
||||||
|
|
||||||
Task::none()
|
|
||||||
}
|
|
||||||
Message::BinaryTypeChanged(x) => {
|
Message::BinaryTypeChanged(x) => {
|
||||||
self.selected_binary_type = Some(x);
|
self.selected_binary_type = Some(x);
|
||||||
Task::none()
|
Task::none()
|
||||||
@@ -605,12 +599,10 @@ impl Application for Pumpbin {
|
|||||||
self.update(Message::PluginItemClicked(selected_plugin));
|
self.update(Message::PluginItemClicked(selected_plugin));
|
||||||
}
|
}
|
||||||
self.plugins = plugins;
|
self.plugins = plugins;
|
||||||
self.show_message(format!("Added {} plugins, {} failed.", success, failed));
|
self.show_message(format!("Added {} plugins, {} failed.", success, failed))
|
||||||
}
|
}
|
||||||
Err(e) => self.show_message(e),
|
Err(e) => self.show_message(e),
|
||||||
}
|
}
|
||||||
|
|
||||||
Task::none()
|
|
||||||
}
|
}
|
||||||
Message::RemovePlugin(x) => {
|
Message::RemovePlugin(x) => {
|
||||||
let mut plugins = self.plugins().clone();
|
let mut plugins = self.plugins().clone();
|
||||||
@@ -628,8 +620,7 @@ impl Application for Pumpbin {
|
|||||||
};
|
};
|
||||||
Task::perform(remove_plugin, Message::RemovePluginDone)
|
Task::perform(remove_plugin, Message::RemovePluginDone)
|
||||||
}
|
}
|
||||||
Message::RemovePluginDone(x) => {
|
Message::RemovePluginDone(x) => match x {
|
||||||
match x {
|
|
||||||
Ok((plugin_name, plugins)) => {
|
Ok((plugin_name, plugins)) => {
|
||||||
self.plugins = plugins;
|
self.plugins = plugins;
|
||||||
|
|
||||||
@@ -647,12 +638,10 @@ impl Application for Pumpbin {
|
|||||||
self.selected_plugin = None;
|
self.selected_plugin = None;
|
||||||
self.shellcode_save_type = ShellcodeSaveType::Local;
|
self.shellcode_save_type = ShellcodeSaveType::Local;
|
||||||
}
|
}
|
||||||
self.show_message(format!("Removed plugin {}", plugin_name));
|
self.show_message(format!("Removed plugin {}", plugin_name))
|
||||||
}
|
}
|
||||||
Err(e) => self.show_message(e),
|
Err(e) => self.show_message(e),
|
||||||
}
|
},
|
||||||
Task::none()
|
|
||||||
}
|
|
||||||
Message::PluginItemClicked(x) => {
|
Message::PluginItemClicked(x) => {
|
||||||
// unwrap is safe.
|
// unwrap is safe.
|
||||||
// UI implemented strict restrictions.
|
// UI implemented strict restrictions.
|
||||||
@@ -662,9 +651,9 @@ impl Application for Pumpbin {
|
|||||||
if plugin.plugin_name() == selected_plugin {
|
if plugin.plugin_name() == selected_plugin {
|
||||||
// random encryption pass
|
// random encryption pass
|
||||||
self.random_encrypt_pass();
|
self.random_encrypt_pass();
|
||||||
self.show_message("Generated new random encryption passwords.".to_string());
|
return self.show_message(
|
||||||
|
"Generated new random encryption passwords.".to_string(),
|
||||||
return Task::none();
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -711,13 +700,13 @@ impl Application for Pumpbin {
|
|||||||
}
|
}
|
||||||
Message::B1nClicked => {
|
Message::B1nClicked => {
|
||||||
if open::that(env!("CARGO_PKG_HOMEPAGE")).is_err() {
|
if open::that(env!("CARGO_PKG_HOMEPAGE")).is_err() {
|
||||||
self.show_message("Open home failed.".into());
|
return self.show_message("Open home failed.".into());
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
Message::GithubClicked => {
|
Message::GithubClicked => {
|
||||||
if open::that(env!("CARGO_PKG_REPOSITORY")).is_err() {
|
if open::that(env!("CARGO_PKG_REPOSITORY")).is_err() {
|
||||||
self.show_message("Open repo failed.".into());
|
return self.show_message("Open repo failed.".into());
|
||||||
}
|
}
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
@@ -725,6 +714,10 @@ impl Application for Pumpbin {
|
|||||||
self.selected_theme = x;
|
self.selected_theme = x;
|
||||||
Task::none()
|
Task::none()
|
||||||
}
|
}
|
||||||
|
Message::ClearMessage(_) => {
|
||||||
|
self.message = "Welcome to PumpBin!".to_string();
|
||||||
|
Task::none()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1120,7 +1113,13 @@ impl Application for Pumpbin {
|
|||||||
.width(Length::Fill)
|
.width(Length::Fill)
|
||||||
.height(Length::Fill);
|
.height(Length::Fill);
|
||||||
|
|
||||||
let message = row![text(" ").size(25), text(&self.message)].align_items(Alignment::Center);
|
let message = row![
|
||||||
|
text(" ")
|
||||||
|
.color(self.theme().extended_palette().primary.base.color)
|
||||||
|
.size(25),
|
||||||
|
text(&self.message).color(self.theme().extended_palette().primary.base.color)
|
||||||
|
]
|
||||||
|
.align_items(Alignment::Center);
|
||||||
|
|
||||||
let b1n = button(
|
let b1n = button(
|
||||||
Svg::new(Handle::from_memory(include_bytes!(
|
Svg::new(Handle::from_memory(include_bytes!(
|
||||||
|
|||||||
Reference in New Issue
Block a user