mirror of
https://github.com/umutcamliyurt/Amnezichat.git
synced 2025-05-04 22:50:47 +01:00
Add host server option to GUI
This commit is contained in:
parent
2193e70104
commit
0fce6c8490
17
README.md
17
README.md
@ -65,15 +65,15 @@ Amnezichat offers a highly secure and privacy-focused messaging experience by en
|
|||||||
sudo apt install docker.io git
|
sudo apt install docker.io git
|
||||||
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
||||||
cd Amnezichat/server/
|
cd Amnezichat/server/
|
||||||
sudo docker build -t amnezichatserver:latest .
|
docker build --network=host -t amnezichatserver:latest .
|
||||||
sudo docker run -p 8080:8080 amnezichatserver:latest
|
docker run --network=host amnezichatserver:latest
|
||||||
|
|
||||||
## Client setup:
|
## Client setup:
|
||||||
|
|
||||||
**For Web UI connect to http://localhost:8000**
|
**For Web UI connect to http://localhost:8000**
|
||||||
|
|
||||||
sudo apt update
|
sudo apt update
|
||||||
sudo apt install curl build-essential git tor
|
sudo apt install curl build-essential git tor xterm
|
||||||
sudo systemctl enable --now tor.service
|
sudo systemctl enable --now tor.service
|
||||||
curl https://sh.rustup.rs -sSf | sh -s -- -y
|
curl https://sh.rustup.rs -sSf | sh -s -- -y
|
||||||
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
||||||
@ -87,8 +87,15 @@ Amnezichat offers a highly secure and privacy-focused messaging experience by en
|
|||||||
sudo apt install docker.io git
|
sudo apt install docker.io git
|
||||||
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
||||||
cd Amnezichat/client/
|
cd Amnezichat/client/
|
||||||
sudo docker build -t amnezichat:latest .
|
docker build --network=host -t amnezichat .
|
||||||
sudo docker run -p 8000:8000 amnezichat:latest
|
xhost +local:docker
|
||||||
|
docker run --rm \
|
||||||
|
--network=host \
|
||||||
|
-e DISPLAY=$DISPLAY \
|
||||||
|
-v /tmp/.X11-unix:/tmp/.X11-unix \
|
||||||
|
--env QT_X11_NO_MITSHM=1 \
|
||||||
|
amnezichat:latest
|
||||||
|
|
||||||
|
|
||||||
## Requirements:
|
## Requirements:
|
||||||
|
|
||||||
|
16
README_TR.md
16
README_TR.md
@ -65,15 +65,15 @@ Amnezichat, hiçbir kayıt tutulmamasını ve tüm mesaj verilerinin yalnızca s
|
|||||||
sudo apt install docker.io git
|
sudo apt install docker.io git
|
||||||
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
||||||
cd Amnezichat/server/
|
cd Amnezichat/server/
|
||||||
sudo docker build -t amnezichatserver:latest .
|
docker build --network=host -t amnezichatserver:latest .
|
||||||
sudo docker run -p 8080:8080 amnezichatserver:latest
|
docker run --network=host amnezichatserver:latest
|
||||||
|
|
||||||
## İstemci kurulumu:
|
## İstemci kurulumu:
|
||||||
|
|
||||||
**Web UI için http://localhost:8000 adresine bağlanın**
|
**Web UI için http://localhost:8000 adresine bağlanın**
|
||||||
|
|
||||||
sudo apt update
|
sudo apt update
|
||||||
sudo apt install curl build-essential git tor
|
sudo apt install curl build-essential git tor xterm
|
||||||
sudo systemctl enable --now tor.service
|
sudo systemctl enable --now tor.service
|
||||||
curl https://sh.rustup.rs -sSf | sh -s -- -y
|
curl https://sh.rustup.rs -sSf | sh -s -- -y
|
||||||
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
||||||
@ -87,8 +87,14 @@ Amnezichat, hiçbir kayıt tutulmamasını ve tüm mesaj verilerinin yalnızca s
|
|||||||
sudo apt install docker.io git
|
sudo apt install docker.io git
|
||||||
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
||||||
cd Amnezichat/client/
|
cd Amnezichat/client/
|
||||||
sudo docker build -t amnezichat:latest .
|
docker build --network=host -t amnezichat .
|
||||||
sudo docker run -p 8000:8000 amnezichat:latest
|
xhost +local:docker
|
||||||
|
docker run --rm \
|
||||||
|
--network=host \
|
||||||
|
-e DISPLAY=$DISPLAY \
|
||||||
|
-v /tmp/.X11-unix:/tmp/.X11-unix \
|
||||||
|
--env QT_X11_NO_MITSHM=1 \
|
||||||
|
amnezichat:latest
|
||||||
|
|
||||||
## Gereksinimler:
|
## Gereksinimler:
|
||||||
|
|
||||||
|
@ -24,4 +24,5 @@ ed25519-dalek = "2.1.1"
|
|||||||
rocket = { version = "0.5", features = ["json"] }
|
rocket = { version = "0.5", features = ["json"] }
|
||||||
eframe = "0.26"
|
eframe = "0.26"
|
||||||
egui = "0.26"
|
egui = "0.26"
|
||||||
rfd = "0.12"
|
rfd = "0.12"
|
||||||
|
which = "4.4"
|
@ -9,10 +9,21 @@ RUN apt-get update && \
|
|||||||
apt-get install -y \
|
apt-get install -y \
|
||||||
curl \
|
curl \
|
||||||
build-essential \
|
build-essential \
|
||||||
|
clang \
|
||||||
|
cmake \
|
||||||
|
libclang-dev \
|
||||||
|
llvm-dev \
|
||||||
|
net-tools \
|
||||||
|
libxkbcommon-x11-0 \
|
||||||
git \
|
git \
|
||||||
tor && \
|
tor \
|
||||||
apt-get clean && \
|
xterm \
|
||||||
rm -rf /var/lib/apt/lists/*
|
pkg-config \
|
||||||
|
iputils-ping \
|
||||||
|
libglib2.0-dev \
|
||||||
|
libssl-dev \
|
||||||
|
libgtk-3-dev \
|
||||||
|
dnsutils
|
||||||
|
|
||||||
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
|
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
|
||||||
|
|
||||||
@ -23,4 +34,10 @@ RUN cargo build --release
|
|||||||
|
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|
||||||
CMD tor & cargo run --release
|
CMD bash -c "\
|
||||||
|
if pgrep -x tor > /dev/null; then \
|
||||||
|
echo 'Killing existing Tor process...'; \
|
||||||
|
pkill -x tor; \
|
||||||
|
sleep 1; \
|
||||||
|
fi; \
|
||||||
|
cargo run --release"
|
@ -51,6 +51,7 @@ use std::{
|
|||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
error::Error,
|
error::Error,
|
||||||
};
|
};
|
||||||
|
use std::fs;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use chacha20poly1305::aead::OsRng;
|
use chacha20poly1305::aead::OsRng;
|
||||||
use rand::RngCore;
|
use rand::RngCore;
|
||||||
@ -61,6 +62,9 @@ use rfd::MessageDialog;
|
|||||||
use rfd::MessageButtons;
|
use rfd::MessageButtons;
|
||||||
use rfd::MessageLevel;
|
use rfd::MessageLevel;
|
||||||
use rfd::MessageDialogResult;
|
use rfd::MessageDialogResult;
|
||||||
|
use std::process::Stdio;
|
||||||
|
use std::os::unix::fs::PermissionsExt;
|
||||||
|
use which::which;
|
||||||
|
|
||||||
fn get_raw_bytes_public_key(pk: &PublicKey) -> &[u8] {
|
fn get_raw_bytes_public_key(pk: &PublicKey) -> &[u8] {
|
||||||
pk.as_ref()
|
pk.as_ref()
|
||||||
@ -250,11 +254,8 @@ impl Default for AppState {
|
|||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
let mut options = eframe::NativeOptions::default();
|
let mut options = eframe::NativeOptions::default();
|
||||||
|
options.viewport.resizable = Some(false);
|
||||||
options.viewport.resizable = Some(false);
|
options.viewport.inner_size = Some(egui::vec2(600.0, 1000.0));
|
||||||
|
|
||||||
options.viewport.inner_size = Some(egui::vec2(600.0, 900.0));
|
|
||||||
|
|
||||||
eframe::run_native("Messaging Setup", options, Box::new(|_cc| Box::new(SetupApp::default())))?;
|
eframe::run_native("Messaging Setup", options, Box::new(|_cc| Box::new(SetupApp::default())))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -284,7 +285,6 @@ impl eframe::App for SetupApp {
|
|||||||
ui.label(egui::RichText::new("Choose an action:").size(24.0));
|
ui.label(egui::RichText::new("Choose an action:").size(24.0));
|
||||||
ui.add_space(10.0);
|
ui.add_space(10.0);
|
||||||
ui.horizontal_wrapped(|ui| {
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
|
||||||
ui.add_space(20.0);
|
ui.add_space(20.0);
|
||||||
if ui.add(
|
if ui.add(
|
||||||
egui::Button::new(egui::RichText::new("➕ Create Room").size(24.0))
|
egui::Button::new(egui::RichText::new("➕ Create Room").size(24.0))
|
||||||
@ -390,11 +390,25 @@ impl eframe::App for SetupApp {
|
|||||||
if let Err(err) = validate_and_start(self.state.clone()) {
|
if let Err(err) = validate_and_start(self.state.clone()) {
|
||||||
self.state.error_message = Some(err.to_string());
|
self.state.error_message = Some(err.to_string());
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
self.state.show_url_label = true;
|
self.state.show_url_label = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ui.add_space(20.0);
|
||||||
|
|
||||||
|
if ui.add(
|
||||||
|
egui::Button::new(egui::RichText::new("🌐 Host Server").size(24.0))
|
||||||
|
.fill(egui::Color32::from_rgb(30, 30, 150))
|
||||||
|
.min_size(egui::vec2(250.0, 50.0))
|
||||||
|
).clicked() {
|
||||||
|
self.state.error_message = None;
|
||||||
|
std::thread::spawn(|| {
|
||||||
|
if let Err(e) = host_server() {
|
||||||
|
eprintln!("Host server error: {}", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(err) = &self.state.error_message {
|
if let Some(err) = &self.state.error_message {
|
||||||
ui.add_space(20.0);
|
ui.add_space(20.0);
|
||||||
ui.colored_label(egui::Color32::RED, egui::RichText::new(format!("❗ {}", err)).size(22.0));
|
ui.colored_label(egui::Color32::RED, egui::RichText::new(format!("❗ {}", err)).size(22.0));
|
||||||
@ -409,6 +423,110 @@ impl eframe::App for SetupApp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn host_server() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let pkg_install = if which("apt").is_ok() {
|
||||||
|
"sudo apt update && sudo apt install -y git curl build-essential tor"
|
||||||
|
} else if which("dnf").is_ok() {
|
||||||
|
"sudo dnf install -y git curl gcc cmake make kernel-devel tor"
|
||||||
|
} else if which("pacman").is_ok() {
|
||||||
|
"sudo pacman -Sy --noconfirm git curl base-devel tor"
|
||||||
|
} else {
|
||||||
|
return Err("No supported package manager found".into());
|
||||||
|
};
|
||||||
|
|
||||||
|
Command::new("xterm")
|
||||||
|
.arg("-e")
|
||||||
|
.arg(format!("bash -c '{}'", pkg_install))
|
||||||
|
.spawn()?
|
||||||
|
.wait()?;
|
||||||
|
|
||||||
|
let setup_script = r#"
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Install Rust if not already installed
|
||||||
|
if ! command -v cargo &> /dev/null; then
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||||
|
source $HOME/.cargo/env
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clone the repo if not already cloned
|
||||||
|
if [ ! -d "Amnezichat" ]; then
|
||||||
|
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd Amnezichat
|
||||||
|
|
||||||
|
# Clean everything except 'server'
|
||||||
|
find . -mindepth 1 -maxdepth 1 ! -name 'server' -exec rm -rf {} +
|
||||||
|
|
||||||
|
cd server
|
||||||
|
cargo build --release
|
||||||
|
cargo run --release
|
||||||
|
"#;
|
||||||
|
|
||||||
|
fs::write("start_server.sh", setup_script)?;
|
||||||
|
fs::set_permissions("start_server.sh", fs::Permissions::from_mode(0o755))?;
|
||||||
|
|
||||||
|
Command::new("xterm")
|
||||||
|
.arg("-e")
|
||||||
|
.arg("bash -c './start_server.sh'")
|
||||||
|
.spawn()?
|
||||||
|
.wait()?;
|
||||||
|
|
||||||
|
configure_tor_for_onion_service()?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn configure_tor_for_onion_service() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let hidden_dir = "./hidden_service";
|
||||||
|
fs::create_dir_all(hidden_dir)?;
|
||||||
|
fs::set_permissions(hidden_dir, fs::Permissions::from_mode(0o700))?;
|
||||||
|
|
||||||
|
let torrc_path = format!("{}/torrc", hidden_dir);
|
||||||
|
let torrc_content = format!(
|
||||||
|
"HiddenServiceDir {}\nHiddenServicePort 80 127.0.0.1:8080\n",
|
||||||
|
hidden_dir
|
||||||
|
);
|
||||||
|
let mut file = OpenOptions::new()
|
||||||
|
.create(true)
|
||||||
|
.write(true)
|
||||||
|
.truncate(true)
|
||||||
|
.open(&torrc_path)?;
|
||||||
|
file.write_all(torrc_content.as_bytes())?;
|
||||||
|
|
||||||
|
let _ = Command::new("pkill").arg("tor").output();
|
||||||
|
|
||||||
|
let tor_cmd = format!("tor -f {}", torrc_path);
|
||||||
|
Command::new("nohup")
|
||||||
|
.arg("bash")
|
||||||
|
.arg("-c")
|
||||||
|
.arg(&tor_cmd)
|
||||||
|
.stdout(Stdio::null())
|
||||||
|
.stderr(Stdio::null())
|
||||||
|
.spawn()?;
|
||||||
|
|
||||||
|
let hostname_path = format!("{}/hostname", hidden_dir);
|
||||||
|
let start_time = std::time::Instant::now();
|
||||||
|
while !Path::new(&hostname_path).exists() {
|
||||||
|
if start_time.elapsed().as_secs() > 30 {
|
||||||
|
return Err("Timeout waiting for Tor to create the .onion address.".into());
|
||||||
|
}
|
||||||
|
std::thread::sleep(std::time::Duration::from_secs(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
let onion = fs::read_to_string(&hostname_path)?.trim().to_string();
|
||||||
|
println!("Your Amnezichat server is live at: http://{}", onion);
|
||||||
|
|
||||||
|
MessageDialog::new()
|
||||||
|
.set_title("Tor Hidden Service")
|
||||||
|
.set_description(&format!("Your Amnezichat server is live at: http://{}", onion))
|
||||||
|
.show();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn validate_and_start(state: AppState) -> Result<(), Box<dyn Error>> {
|
fn validate_and_start(state: AppState) -> Result<(), Box<dyn Error>> {
|
||||||
if state.server_url.is_empty() || state.username.is_empty() || state.private_password.is_empty() {
|
if state.server_url.is_empty() || state.username.is_empty() || state.private_password.is_empty() {
|
||||||
return Err("Please fill in all fields.".into());
|
return Err("Please fill in all fields.".into());
|
||||||
@ -751,4 +869,4 @@ fn clear_screen() {
|
|||||||
.status()
|
.status()
|
||||||
.expect("Failed to clear screen on Unix");
|
.expect("Failed to clear screen on Unix");
|
||||||
}
|
}
|
||||||
}
|
}
|
BIN
screenshot.png
BIN
screenshot.png
Binary file not shown.
Before Width: | Height: | Size: 333 KiB After Width: | Height: | Size: 338 KiB |
@ -53,7 +53,7 @@
|
|||||||
<h3>Build it Yourself</h3>
|
<h3>Build it Yourself</h3>
|
||||||
<pre>
|
<pre>
|
||||||
sudo apt update
|
sudo apt update
|
||||||
sudo apt install curl build-essential git tor
|
sudo apt install curl build-essential git tor xterm
|
||||||
sudo systemctl enable --now tor.service
|
sudo systemctl enable --now tor.service
|
||||||
curl https://sh.rustup.rs -sSf | sh -s -- -y
|
curl https://sh.rustup.rs -sSf | sh -s -- -y
|
||||||
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
git clone https://github.com/umutcamliyurt/Amnezichat.git
|
||||||
|
Loading…
x
Reference in New Issue
Block a user