aboutsummaryrefslogtreecommitdiff
path: root/src/server/net
diff options
context:
space:
mode:
authorFuwn <[email protected]>2021-04-26 13:30:51 +0000
committerFuwn <[email protected]>2021-04-26 13:30:51 +0000
commitaf68ae63e4b0f5f6237bbda4fed9fd2a6022357d (patch)
tree02bbd59bf0a54808e335c1d703d3dac4cdc0773b /src/server/net
parentfix: Actually remove legacy server module (diff)
downloadwhirl-af68ae63e4b0f5f6237bbda4fed9fd2a6022357d.tar.xz
whirl-af68ae63e4b0f5f6237bbda4fed9fd2a6022357d.zip
fmt: Rename re_server module to server
Diffstat (limited to 'src/server/net')
-rw-r--r--src/server/net/constants.rs93
-rw-r--r--src/server/net/converter.rs57
-rw-r--r--src/server/net/mod.rs7
-rw-r--r--src/server/net/property_parser.rs38
-rw-r--r--src/server/net/structure.rs18
5 files changed, 213 insertions, 0 deletions
diff --git a/src/server/net/constants.rs b/src/server/net/constants.rs
new file mode 100644
index 0000000..04d94a9
--- /dev/null
+++ b/src/server/net/constants.rs
@@ -0,0 +1,93 @@
+// Copyleft 2021-2021 Whirlsplash
+// SPDX-License-Identifier: GPL-3.0-only
+
+pub const VAR_PROTOCOL_VERSION: i32 = 24;
+pub const STATECMD: i32 = 2;
+pub const MAXCMD: i32 = 255;
+pub const CURRENT_ROOM: i32 = 253;
+pub const CLIENT: i32 = 1;
+pub const CO: i32 = 254;
+pub const PO: i32 = 255;
+pub const VAR_APPNAME: i32 = 1;
+pub const VAR_USERNAME: i32 = 2;
+pub const VAR_PROTOCOL: i32 = 3;
+pub const VAR_ERROR: i32 = 4;
+pub const VAR_CHANNEL: i32 = 5;
+pub const VAR_BITMAP: i32 = 5;
+pub const VAR_PASSWORD: i32 = 6;
+pub const VAR_AVATARS: i32 = 7;
+pub const VAR_UPDATETIME: i32 = 8;
+pub const VAR_CLIENT: i32 = 9;
+pub const VAR_SERIAL: i32 = 10;
+pub const VAR_EMAIL: i32 = 11;
+pub const VAR_LOGONOFF: i32 = 12;
+pub const VAR_DURATION: i32 = 13;
+pub const VAR_GUEST: i32 = 14;
+pub const VAR_SERVERTYPE: i32 = 15;
+pub const VAR_VIZCARD: i32 = 16;
+pub const VAR_NEW_PASSWD: i32 = 20;
+pub const VAR_PRIV: i32 = 22;
+pub const VAR_ASLEEP: i32 = 23;
+pub const VAR_EXTERNAL_HTTP_SERVER: i32 = 24;
+pub const VAR_SCRIPT_SERVER: i32 = 25;
+pub const VAR_SMTP_SERVER: i32 = 26;
+pub const VAR_MAIL_DOMAIN: i32 = 27;
+pub const VAR_NEW_USERNAME: i32 = 28;
+pub const VAR_INTERNAL_HTTP_SERVER: i32 = 29;
+pub const VAR_INVENTORY: i32 = 32;
+pub const ACK: i32 = 0;
+pub const NAK_BAD_USER: i32 = 1;
+pub const NAK_MAX_ORDINARY: i32 = 2;
+pub const NAK_MAX_PRIORITY: i32 = 3;
+pub const NAL_BAD_WORLD: i32 = 4;
+pub const NAK_FATAIL: i32 = 5;
+pub const NAK_BAD_PROTOCOL: i32 = 6;
+pub const NAK_BAD_CLIENTSW: i32 = 7;
+pub const NAK_BAD_ROOM: i32 = 8;
+pub const NAK_BAD_SERIAL: i32 = 9;
+pub const NAK_TAKEN_SERIAL: i32 = 10;
+pub const NAK_TAKEN_USER: i32 = 11;
+pub const NAK_NO_SUCH_USER: i32 = 12;
+pub const NAK_BAD_PASSWORD: i32 = 13;
+pub const NAK_BAD_ACCOUNT: i32 = 14;
+pub const NAK_NOT_LOGGEDON: i32 = 15;
+pub const NAK_BAD_IPADDRESS: i32 = 16;
+pub const NAK_LOGGEDON: i32 = 17;
+pub const NAK_CRYPT_METHOD: i32 = 18;
+pub const NAK_CRYPT_ERROR: i32 = 19;
+pub const NAK_SESSIONINIT: i32 = 20;
+pub const NAK_ROOM_FULL: i32 = 21;
+pub const NAK_SHUTDOWN: i32 = 100;
+pub const NAK_WRITE_ERROR: i32 = 101;
+pub const NAK_READ_ERROR: i32 = 102;
+pub const NAK_UNEXPECTED: i32 = 103;
+pub const NAK_CONNECTION: i32 = 104;
+pub const NAK_IOSTREAMS: i32 = 105;
+pub const NAK_TIMEOUT: i32 = 106;
+pub const NAK_UNREACHABLE: i32 = 107;
+pub const STATUS_CONNECTED: i32 = 200;
+pub const STATUS_DETACHING: i32 = 201;
+pub const STATUS_WILLRETRY: i32 = 202;
+pub const STATUS_DISCONNECTED: i32 = 203;
+pub const STATUS_DEAD: i32 = 204;
+pub const STATUS_OFFLINE: i32 = 205;
+pub const STATUS_GALAXY_ONLINE: i32 = 206;
+pub const STATUS_GALAXY_OFFLINE: i32 = 206;
+pub const PROPFLAG_BINARY: i32 = 16;
+pub const PROPFLAG_FINGER: i32 = 32;
+pub const PROPFLAG_AUTOUPDATE: i32 = 64;
+pub const PROPFLAG_DBSTORE: i32 = 128;
+pub const PROPACCESS_POSSESS: i32 = 1;
+pub const PROPACCESS_PRIVATE: i32 = 2;
+pub const SERVER_UNKNOWN: i32 = 0;
+pub const USER_SERVER_DB: i32 = 1;
+pub const USER_SERVER_ANON: i32 = 2;
+pub const ROOM_SERVER_US: i32 = 3;
+pub const ROOM_SERVER_ANON: i32 = 4;
+pub const PRIV_NONE: i32 = 0;
+pub const PRIV_BUILD: i32 = 1;
+pub const PRIV_BROADCAST: i32 = 2;
+pub const PRIV_PROPERTY: i32 = 4;
+pub const PRIV_VIP: i32 = 8;
+pub const PRIV_VIP2: i32 = 16;
+pub const PRIV_SPECIALGUEST: i32 = 64;
diff --git a/src/server/net/converter.rs b/src/server/net/converter.rs
new file mode 100644
index 0000000..148a35e
--- /dev/null
+++ b/src/server/net/converter.rs
@@ -0,0 +1,57 @@
+// Copyleft 2021-2021 Whirlsplash
+// SPDX-License-Identifier: GPL-3.0-only
+
+use bytes::{BufMut, BytesMut};
+
+use crate::server::{
+ cmd::constants::PROPUPD,
+ net::{
+ constants::{PROPACCESS_POSSESS, PROPFLAG_DBSTORE},
+ structure::NetworkProperty,
+ },
+};
+
+pub fn property_list_to_bytes(
+ command_id: i32,
+ obj_id: i32,
+ mut property_list: Vec<NetworkProperty>,
+) -> Vec<u8> {
+ let mut command = BytesMut::new();
+
+ // Iterate over all network properties
+ loop {
+ // Check if there are any properties left
+ debug!("props left: {}", property_list.len());
+ if property_list.is_empty() {
+ break;
+ }
+
+ let property = &property_list[0]; // Property we are currently iterating over
+ debug!("current prop: {}:{}", property.prop_id, property.value);
+
+ command.put_u8(property.prop_id as u8); // Property ID
+
+ // NOTE: THIS IS SUPER BAD DO NOT DO THIS! But it works!
+ if command_id == PROPUPD {
+ command.put_u8(PROPFLAG_DBSTORE as u8); // Flag (s)
+ command.put_u8(PROPACCESS_POSSESS as u8); // Access
+ }
+
+ command.put_u8(property.value.len() as u8); // Property UTF-8 Length
+ command.put_slice(property.value.as_bytes()); // Property UTF-8
+
+ property_list.reverse();
+ property_list.pop();
+ property_list.reverse();
+ }
+
+ // Convert to vector and insert the header
+ let mut command_as_vec = command.to_vec();
+
+ command_as_vec.insert(0, command_id as u8); // Command ID
+ command_as_vec.insert(0, obj_id as u8); // ObjId
+ command_as_vec.insert(0, command.len() as u8 + 3); // Data length
+
+ // Return bytes
+ command_as_vec
+}
diff --git a/src/server/net/mod.rs b/src/server/net/mod.rs
new file mode 100644
index 0000000..c88ab7f
--- /dev/null
+++ b/src/server/net/mod.rs
@@ -0,0 +1,7 @@
+// Copyleft 2021-2021 Whirlsplash
+// SPDX-License-Identifier: GPL-3.0-only
+
+pub mod constants;
+pub mod converter;
+pub mod property_parser;
+pub mod structure;
diff --git a/src/server/net/property_parser.rs b/src/server/net/property_parser.rs
new file mode 100644
index 0000000..8a4f960
--- /dev/null
+++ b/src/server/net/property_parser.rs
@@ -0,0 +1,38 @@
+// Copyleft 2021-2021 Whirlsplash
+// SPDX-License-Identifier: GPL-3.0-only
+
+use std::str::from_utf8;
+
+use crate::server::net::structure::NetworkProperty;
+
+/// Iterate over a network property in the form of bytes and return a list of
+/// human-readable properties.
+pub fn parse_network_property(mut data: Vec<u8>) -> Vec<NetworkProperty> {
+ let mut property_list = vec![];
+
+ // Iterate over all network properties
+ loop {
+ // Check if any commands are present
+ if data.len() <= 2 {
+ break;
+ }
+ debug!("iteration: {:?}", data);
+ // if data[0] == 0 {
+ // break;
+ // }
+
+ let property_length = data[1] + 2;
+ property_list.push(NetworkProperty {
+ prop_id: data[0] as i32,
+ value: from_utf8(&data[2..data[1] as usize + 2])
+ .unwrap()
+ .to_string(),
+ });
+
+ // Remove current property from the network property
+ data = data[property_length as usize..].to_vec();
+ }
+
+ // Return the human-readable network property
+ property_list
+}
diff --git a/src/server/net/structure.rs b/src/server/net/structure.rs
new file mode 100644
index 0000000..0128c0e
--- /dev/null
+++ b/src/server/net/structure.rs
@@ -0,0 +1,18 @@
+// Copyleft 2021-2021 Whirlsplash
+// SPDX-License-Identifier: GPL-3.0-only
+
+pub struct NetworkProperty {
+ pub prop_id: i32,
+ pub value: String,
+}
+impl NetworkProperty {
+ pub fn new() -> Self { NetworkProperty::default() }
+}
+impl Default for NetworkProperty {
+ fn default() -> Self {
+ NetworkProperty {
+ prop_id: 0,
+ value: "".to_string(),
+ }
+ }
+}