Skip to main content

why2_chat/
options.rs

1/*
2This is part of WHY2
3Copyright (C) 2022-2026 Václav Šmejkal
4
5This program is free software: you can redistribute it and/or modify
6it under the terms of the GNU General Public License as published by
7the Free Software Foundation, either version 3 of the License, or
8(at your option) any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program.  If not, see <https://www.gnu.org/licenses/>.
17*/
18
19use zeroize::Zeroizing;
20
21use std::sync::atomic::{ AtomicBool, Ordering };
22
23#[cfg(feature = "client")]
24use std::sync::
25{
26    Arc,
27    Mutex,
28    RwLock,
29    LazyLock,
30    OnceLock,
31    atomic::AtomicUsize,
32};
33
34//CONSTS
35pub const METADATA_URL: &str        = "https://crates.io/api/v1/crates/why2";                                 //URL FOR PROJECT METADATA
36
37pub const USER_CONFIG_DIR: &str     = "{HOME}/.config";                                                       //USER CONFIG DIRECTORY
38pub const CONFIG_DIR: &str          = "/WHY2";                                                                //DIRECTORY FOR CONFIG FILES
39pub const SERVER_CONFIG: &str       = "/server.toml";                                                         //SERVER CONFIG FILE
40pub const CLIENT_CONFIG: &str       = "/client.toml";                                                         //CLIENT CONFIG FILE
41pub const SERVER_USERS_CONFIG: &str = "/server_users.toml";                                                   //SERVER USERS CONFIG FILE
42pub const CONFIG_URL: &str          = "https://git.satan.red/ENGO150/WHY2/-/raw/development/chat/src/config"; //CONFIG FILE DOWNLOAD URL
43
44pub const SERVER_KEYS_CONFIG: &str  = "/server_keys.toml";                                                    //SERVER PUBKEY CONFIG FILE
45pub const SERVER_KEYS_DIR: &str     = "/server_keys";                                                         //SERVER KEYS DIRECTORY
46pub const SERVER_SKEY: &str         = "/private";                                                             //SERVER PRIVATE KEY FILE
47pub const SERVER_PKEY: &str         = "/public";                                                              //SERVER PUBLIC KEY FILE
48pub const SERVER_PQ_SKEY: &str      = "/private_pq";                                                          //SERVER POST-QUANTUM PRIVATE KEY FILE
49pub const SERVER_PQ_PKEY: &str      = "/public_pq";                                                           //SERVER POST-QUANTUM PUBLIC KEY FILE
50
51pub const FETCH_TIMEOUT: u64        = 5000;                                                                   //TIMOUT FOR FETCHING DATA (MS)
52
53pub const REKEY_INTERVAL: u64       = 600;                                                                    //INTERVAL FOR RE-REKEYING (SECS)
54
55//DO NOT CHANGE CONST BELOW UNLESS YOU ARE ABSOLUTELY SURE WHAT ARE YOU DOING
56pub const OBFUSCATION_KEY: &[u8; 32]      =         //KEY FOR OBFUSCATING NON-ENCRYPTED PACKETS (NOT A SECURITY FEATURE)
57&[
58    0x9A, 0xF7, 0x1C, 0xD4, 0x62, 0x3E, 0x8B, 0x5A,
59    0x0F, 0x2D, 0xE1, 0x79, 0x4C, 0xB8, 0x63, 0x90,
60    0x21, 0x55, 0xAE, 0xD6, 0x04, 0x7F, 0x33, 0x82,
61    0xBC, 0x19, 0x40, 0xE7, 0x95, 0x2A, 0x6B, 0xF8,
62];
63
64//TYPES
65pub type SharedKeys = (Zeroizing<Vec<i64>>, Zeroizing<Vec<u8>>);
66
67//SETTINGS
68#[cfg(feature = "server")]
69static VOICE_CHAT: AtomicBool = AtomicBool::new(false);
70
71#[cfg(feature = "client")]
72static KEYS: LazyLock<RwLock<Option<SharedKeys>>> = LazyLock::new(|| //SHARED SYMMETRIC KEY
73{
74    RwLock::new(None)
75});
76
77#[cfg(feature = "client")]
78static ASKING_PASSWORD: AtomicBool = AtomicBool::new(false); //CLIENT IS SENDING PASSWORD (DISABLE ECHO)
79
80#[cfg(feature = "client")]
81static EXTRA_SPACE: AtomicBool = AtomicBool::new(false); //CLIENT DISPLAYED SOME MENU (/help ETC.), ADD EXTRA SPACE ON NEXT MESSAGE
82
83#[cfg(feature = "client")]
84static SENDING_MESSAGES: AtomicBool = AtomicBool::new(false); //SENDING MESSAGES BOOL (CONDITION FOR ADDING MESSAGES TO HISTORY)
85
86#[cfg(feature = "client")]
87pub static INPUT_READ: LazyLock<Arc<Mutex<Vec<char>>>> = LazyLock::new(|| //INPUT READ FROM CLIENT
88{
89    Arc::new(Mutex::new(Vec::new()))
90});
91
92#[cfg(feature = "client")]
93static SEQ: AtomicUsize = AtomicUsize::new(0); //PACKET SEQUENCE NUMBER (CLIENT -> SERVER)
94
95#[cfg(feature = "client")]
96static SERVER_SEQ: AtomicUsize = AtomicUsize::new(0); //PACKET SEQUENCE NUMBER (SERVER -> CLIENT)
97
98#[cfg(feature = "client")]
99static SERVER_ADDRESS: OnceLock<String> = OnceLock::new();
100
101#[cfg(feature = "client")]
102static SOCKS5: AtomicBool = AtomicBool::new(false); //USE SOCKS5 (TOR)
103
104//FUNCTIONS
105//VOICE CHAT
106#[cfg(feature = "server")]
107pub fn enable_voice_chat() //SET VOICE CHAT TO TRUE
108{
109    VOICE_CHAT.store(true, Ordering::Relaxed);
110}
111
112#[cfg(feature = "server")]
113pub fn voice_chat_enabled() -> bool //GET VOICE CHAT
114{
115    VOICE_CHAT.load(Ordering::Relaxed)
116}
117
118//SHARED KEYS
119#[cfg(feature = "client")]
120pub fn set_keys(keys: SharedKeys) //SET KEY
121{
122    let mut shared_key = KEYS.write().unwrap();
123    *shared_key = Some(keys);
124}
125
126#[cfg(feature = "client")]
127pub fn get_keys() -> Option<SharedKeys> //RETURN KEY
128{
129    let shared_key = KEYS.read().unwrap();
130    shared_key.clone()
131}
132
133//ASKING PASSWORD
134#[cfg(feature = "client")]
135pub fn set_asking_password(value: bool) //SET ASKING_PASSWORD
136{
137    ASKING_PASSWORD.store(value, Ordering::Relaxed);
138}
139
140#[cfg(feature = "client")]
141pub fn get_asking_password() -> bool //GET ASKING_PASSWORD
142{
143    ASKING_PASSWORD.load(Ordering::Relaxed)
144}
145
146//ADD EXTRA SPACE
147#[cfg(feature = "client")]
148pub fn set_extra_space(value: bool) //SET EXTRA_SPACE
149{
150    EXTRA_SPACE.store(value, Ordering::Relaxed);
151}
152
153#[cfg(feature = "client")]
154pub fn get_extra_space() -> bool //GET EXTRA_SPACE
155{
156    EXTRA_SPACE.load(Ordering::Relaxed)
157}
158
159//SENDING MESSAGES
160#[cfg(feature = "client")]
161pub fn get_sending_messages() -> bool //GET SENDING_MESSAGES
162{
163    SENDING_MESSAGES.load(Ordering::Relaxed)
164}
165
166#[cfg(feature = "client")]
167pub fn set_sending_messages(value: bool) //SET SENDING_MESSAGES
168{
169    SENDING_MESSAGES.store(value, Ordering::Relaxed);
170}
171
172#[cfg(feature = "client")]
173pub fn get_seq() -> usize //GET SEQUENCE NUMBER
174{
175    SEQ.load(Ordering::Relaxed)
176}
177
178#[cfg(feature = "client")]
179pub fn set_seq(value: usize) //SET SEQUENCE NUMBER
180{
181    SEQ.store(value, Ordering::Relaxed)
182}
183
184#[cfg(feature = "client")]
185pub fn get_server_seq() -> usize //GET SERVER SEQUENCE NUMBER
186{
187    SERVER_SEQ.load(Ordering::Relaxed)
188}
189
190#[cfg(feature = "client")]
191pub fn set_server_seq(value: usize) //SET SERVER SEQUENCE NUMBER
192{
193    SERVER_SEQ.store(value, Ordering::Relaxed)
194}
195
196//SERVER ADDRESS
197#[cfg(feature = "client")]
198pub fn get_server_address() -> String //GET SERVER ADDRESS
199{
200    SERVER_ADDRESS.get().unwrap().to_owned()
201}
202
203#[cfg(feature = "client")]
204pub fn set_server_address(address: &str) //SET SERVER ADDRESS
205{
206    SERVER_ADDRESS.set(address.to_owned()).unwrap();
207}
208
209//SOCKS5
210#[cfg(feature = "client")]
211pub fn enable_socks5() //SET SOCKS5 TO TRUE
212{
213    SOCKS5.store(true, Ordering::Relaxed);
214}
215
216#[cfg(feature = "client")]
217pub fn socks5_enabled() -> bool //GET SOCKS5
218{
219    SOCKS5.load(Ordering::Relaxed)
220}