diff options
| author | Fuwn <[email protected]> | 2021-04-26 13:30:51 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2021-04-26 13:30:51 +0000 |
| commit | af68ae63e4b0f5f6237bbda4fed9fd2a6022357d (patch) | |
| tree | 02bbd59bf0a54808e335c1d703d3dac4cdc0773b /src/server/net | |
| parent | fix: Actually remove legacy server module (diff) | |
| download | whirl-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.rs | 93 | ||||
| -rw-r--r-- | src/server/net/converter.rs | 57 | ||||
| -rw-r--r-- | src/server/net/mod.rs | 7 | ||||
| -rw-r--r-- | src/server/net/property_parser.rs | 38 | ||||
| -rw-r--r-- | src/server/net/structure.rs | 18 |
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(), + } + } +} |