You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

627 lines
16 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
1 year ago
4 years ago
4 years ago
1 year ago
4 years ago
  1. #![allow(incomplete_features)]
  2. pub mod crypto;
  3. pub mod packet;
  4. pub mod character;
  5. pub mod util;
  6. //pub mod item;
  7. use std::io::{Read, Seek};
  8. #[derive(Debug, PartialEq)]
  9. pub enum PacketParseError {
  10. NotEnoughBytes,
  11. WrongPacketCommand {expected: u16, got: u16},
  12. WrongPacketForServerType(u16, Vec<u8>),
  13. UnknownPacket(u16, Vec<u8>),
  14. WrongPacketSize(u16, usize),
  15. WrongMessageCommand {expected: u8, got: u8},
  16. UnknownMessage(u8, Vec<u8>),
  17. DataStructNotLargeEnough(u64, usize),
  18. InvalidValue,
  19. ReadError,
  20. }
  21. pub trait PSOPacketData {
  22. //fn size(&self) -> usize;
  23. fn from_bytes<R: Read + Seek>(cursor: &mut R) -> Result<Self, PacketParseError> where Self: Sized;
  24. fn as_bytes(&self) -> Vec<u8>;
  25. }
  26. impl PSOPacketData for u8 {
  27. fn from_bytes<R: Read>(cursor: &mut R) -> Result<u8, PacketParseError> {
  28. let mut bytes = [0u8; 1];
  29. let len = cursor.read(&mut bytes).map_err(|_| PacketParseError::ReadError)?;
  30. if len == 1 {
  31. Ok(bytes[0])
  32. } else{
  33. Err(PacketParseError::NotEnoughBytes)
  34. }
  35. }
  36. fn as_bytes(&self) -> Vec<u8> {
  37. vec![*self]
  38. }
  39. }
  40. impl PSOPacketData for u16 {
  41. fn from_bytes<R: Read>(cursor: &mut R) -> Result<u16, PacketParseError> {
  42. let mut bytes = [0u8; 2];
  43. let len = cursor.read(&mut bytes).map_err(|_| PacketParseError::ReadError)?;
  44. if len == 2 {
  45. Ok(u16::from_le_bytes(bytes))
  46. }
  47. else {
  48. Err(PacketParseError::NotEnoughBytes)
  49. }
  50. }
  51. fn as_bytes(&self) -> Vec<u8> {
  52. u16::to_le_bytes(*self).to_vec()
  53. }
  54. }
  55. impl PSOPacketData for u32 {
  56. fn from_bytes<R: Read>(cursor: &mut R) -> Result<u32, PacketParseError> {
  57. let mut bytes = [0u8; 4];
  58. let len = cursor.read(&mut bytes).map_err(|_| PacketParseError::ReadError)?;
  59. if len == 4 {
  60. Ok(u32::from_le_bytes(bytes))
  61. }
  62. else {
  63. Err(PacketParseError::NotEnoughBytes)
  64. }
  65. }
  66. fn as_bytes(&self) -> Vec<u8> {
  67. u32::to_le_bytes(*self).to_vec()
  68. }
  69. }
  70. impl PSOPacketData for f32 {
  71. fn from_bytes<R: Read>(cursor: &mut R) -> Result<f32, PacketParseError> {
  72. let mut bytes = [0u8; 4];
  73. let len = cursor.read(&mut bytes).map_err(|_| PacketParseError::ReadError)?;
  74. if len == 4 {
  75. Ok(f32::from_le_bytes(bytes))
  76. }
  77. else {
  78. Err(PacketParseError::NotEnoughBytes)
  79. }
  80. }
  81. fn as_bytes(&self) -> Vec<u8> {
  82. f32::to_le_bytes(*self).to_vec()
  83. }
  84. }
  85. impl PSOPacketData for String {
  86. fn from_bytes<R: Read>(cursor: &mut R) -> Result<String, PacketParseError> {
  87. let mut s: Vec<u8> = Vec::new();
  88. cursor.read_to_end(&mut s).map_err(|_| PacketParseError::ReadError)?;
  89. let mut utf16 = Vec::new();
  90. for c in s.chunks(2) {
  91. utf16.push(u16::from_le_bytes([c[0], c[1]]));
  92. }
  93. Ok(String::from_utf16_lossy(utf16.as_slice()))
  94. }
  95. fn as_bytes(&self) -> Vec<u8> {
  96. let mut buf = Vec::new();
  97. for c in self.as_str().encode_utf16() {
  98. buf.extend_from_slice(&c.to_le_bytes());
  99. }
  100. buf
  101. }
  102. }
  103. #[derive(Clone, PartialEq)]
  104. pub struct ConsumingBlob {
  105. pub blob: Vec<u8>,
  106. }
  107. impl PSOPacketData for ConsumingBlob {
  108. fn from_bytes<R: Read>(cursor: &mut R) -> Result<ConsumingBlob, PacketParseError> {
  109. let mut blob: Vec<u8> = Vec::new();
  110. cursor.read_to_end(&mut blob).map_err(|_| PacketParseError::ReadError)?;
  111. Ok(ConsumingBlob {
  112. blob,
  113. })
  114. }
  115. fn as_bytes(&self) -> Vec<u8> {
  116. self.blob.clone()
  117. }
  118. }
  119. impl std::fmt::Debug for ConsumingBlob {
  120. fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  121. f.debug_struct("ConsumingBlob")
  122. .field("blob", &"[...]")
  123. .finish()
  124. }
  125. }
  126. pub trait PSOPacket: std::fmt::Debug {
  127. // const CMD: u16;
  128. fn from_bytes(data: &[u8]) -> Result<Self, PacketParseError> where Self: Sized;
  129. fn as_bytes(&self) -> Vec<u8>;
  130. }
  131. #[cfg(test)]
  132. mod test {
  133. use super::*;
  134. use psopacket::{pso_packet, pso_message, PSOPacketData};
  135. use crate::packet::messages::PSOMessage;
  136. #[test]
  137. fn test_basic_pso_packet() {
  138. #[pso_packet(0x23)]
  139. struct Test {
  140. a: u32,
  141. b: u16,
  142. c: u16,
  143. }
  144. let test = Test {
  145. a: 123456789,
  146. b: 54321,
  147. c: 9999,
  148. };
  149. let mut bytes = test.as_bytes();
  150. assert!(bytes == vec![16, 0, 35, 0, 0, 0, 0, 0, 21, 205, 91, 7, 49, 212, 15, 39]);
  151. bytes[11] = 17;
  152. let test2 = Test::from_bytes(&bytes).unwrap();
  153. assert!(test2 == Test {
  154. a: 291228949,
  155. b: 54321,
  156. c: 9999,
  157. });
  158. }
  159. #[test]
  160. fn test_array_in_packet() {
  161. #[pso_packet(0x23)]
  162. struct Test {
  163. a: u32,
  164. b: u16,
  165. c: [u16; 3],
  166. }
  167. let test = Test {
  168. a: 123456789,
  169. b: 54321,
  170. c: [1111, 2222, 3333],
  171. };
  172. let mut bytes = test.as_bytes();
  173. assert!(bytes == [20, 0, 35, 0, 0, 0, 0, 0, 21, 205, 91, 7, 49, 212, 87, 4, 174, 8, 5, 13]);
  174. bytes[17] = 17;
  175. let test2 = Test::from_bytes(&bytes).unwrap();
  176. assert!(test2 == Test {
  177. a: 123456789,
  178. b: 54321,
  179. c: [1111, 4526, 3333],
  180. });
  181. }
  182. #[test]
  183. fn test_custom_type_in_packet() {
  184. #[derive(Clone, Debug, PartialEq)]
  185. pub struct MyType {
  186. k: u8,
  187. j: u32,
  188. }
  189. impl PSOPacketData for MyType {
  190. fn from_bytes<R: std::io::Read>(cursor: &mut R) -> Result<MyType, PacketParseError> {
  191. let mut kb = [0u8; 1];
  192. cursor.read(&mut kb).map_err(|_| PacketParseError::ReadError)?;
  193. let mut jb = [0u8; 4];
  194. cursor.read(&mut jb).map_err(|_| PacketParseError::ReadError)?;
  195. Ok(MyType {
  196. k: kb[0],
  197. j: u32::from_le_bytes(jb)
  198. })
  199. }
  200. fn as_bytes(&self) -> Vec<u8> {
  201. let jbytes = u32::to_le_bytes(self.j);
  202. vec![self.k, jbytes[0], jbytes[1], jbytes[2], jbytes[3]]
  203. }
  204. }
  205. #[pso_packet(0x23)]
  206. struct Test {
  207. a: u32,
  208. b: u16,
  209. c: MyType,
  210. d: u8,
  211. }
  212. let test = Test {
  213. a: 123456789,
  214. b: 54321,
  215. c: MyType {
  216. k: 23,
  217. j: 999999,
  218. },
  219. d: 5,
  220. };
  221. let mut bytes = test.as_bytes();
  222. assert!(bytes == [20, 0, 35, 0, 0, 0, 0, 0, 21, 205, 91, 7, 49, 212, 23, 63, 66, 15, 0, 5]);
  223. bytes[17] = 17;
  224. let test2 = Test::from_bytes(&bytes).unwrap();
  225. assert!(test2 == Test {
  226. a: 123456789,
  227. b: 54321,
  228. c: MyType {
  229. k: 23,
  230. j: 1131071,
  231. },
  232. d: 5,
  233. });
  234. }
  235. #[test]
  236. fn test_string_in_packet() {
  237. #[pso_packet(0x23)]
  238. struct Test {
  239. a: u32,
  240. b: u16,
  241. s: String,
  242. }
  243. let test = Test {
  244. a: 123456789,
  245. b: 54321,
  246. s: "asdf あえいおう".to_string(),
  247. };
  248. let mut bytes = test.as_bytes();
  249. assert!(bytes == vec![36, 0, 35, 0, 0, 0, 0, 0, 21, 205, 91, 7, 49, 212, 97, 0, 115, 0, 100, 0,
  250. 102, 0, 32, 0, 66, 48, 72, 48, 68, 48, 74, 48, 70, 48, 0, 0]);
  251. bytes[18] = 99;
  252. let test2 = Test::from_bytes(&bytes).unwrap();
  253. assert!(test2 == Test {
  254. a: 123456789,
  255. b: 54321,
  256. s: "ascf あえいおう\u{0}".to_string(),
  257. });
  258. }
  259. #[test]
  260. fn test_vec_in_packet() {
  261. #[pso_packet(0x23)]
  262. struct Test {
  263. a: u32,
  264. b: u16,
  265. v: Vec<u16>,
  266. }
  267. let test = Test {
  268. a: 123456789,
  269. b: 54321,
  270. v: vec![123,456,789],
  271. };
  272. let mut bytes = test.as_bytes();
  273. assert!(bytes == vec![20, 0, 35, 0, 3, 0, 0, 0, 21, 205, 91, 7, 49, 212, 123, 0, 200, 1, 21, 3]);
  274. bytes[18] = 99;
  275. let test2 = Test::from_bytes(&bytes).unwrap();
  276. assert!(test2 == Test {
  277. a: 123456789,
  278. b: 54321,
  279. v: vec![123,456,867],
  280. });
  281. }
  282. #[test]
  283. fn test_no_flag_packet() {
  284. #[pso_packet(0x23, no_flag)]
  285. struct Test {
  286. a: u32,
  287. b: u16,
  288. c: u16,
  289. }
  290. let test = Test {
  291. a: 123456789,
  292. b: 54321,
  293. c: 9999,
  294. };
  295. let mut bytes = test.as_bytes();
  296. assert!(bytes == vec![12, 0, 35, 0, 21, 205, 91, 7, 49, 212, 15, 39]);
  297. bytes[11] = 17;
  298. let test2 = Test::from_bytes(&bytes).unwrap();
  299. assert!(test2 == Test {
  300. a: 123456789,
  301. b: 54321,
  302. c: 4367,
  303. });
  304. }
  305. #[test]
  306. fn test_command_error() {
  307. #[pso_packet(0x23)]
  308. struct Test {
  309. a: u32,
  310. b: u16,
  311. #[nodebug]
  312. c: [u8; 0x2000],
  313. }
  314. let test = Test {
  315. a: 123456789,
  316. b: 54321,
  317. c: [0; 0x2000],
  318. };
  319. let mut bytes = test.as_bytes();
  320. bytes[2] = 17;
  321. let test2 = Test::from_bytes(&bytes);
  322. assert!(test2 == Err(PacketParseError::WrongPacketCommand { expected: 0x23, got: 17}));
  323. }
  324. #[test]
  325. fn test_derive_pso_data_packet() {
  326. #[derive(PSOPacketData)]
  327. struct Test {
  328. a: u8,
  329. b: u32,
  330. c: u16,
  331. }
  332. let test = Test {
  333. a: 12,
  334. b: 34567,
  335. c: 890,
  336. };
  337. let mut bytes = test.as_bytes();
  338. assert!(bytes == vec![12, 7, 135, 0, 0, 122, 3]);
  339. bytes[2] = 17;
  340. let mut cur = std::io::Cursor::new(bytes.clone());
  341. let test2 = Test::from_bytes(&mut cur).unwrap();
  342. assert!(test2 == Test {
  343. a: 12,
  344. b: 4359,
  345. c: 890
  346. });
  347. }
  348. #[test]
  349. fn test_derive_pso_data_packet_array() {
  350. #[derive(PSOPacketData)]
  351. struct Test {
  352. a: u8,
  353. b: u32,
  354. c: u16,
  355. d: [u8; 5],
  356. }
  357. let test = Test {
  358. a: 12,
  359. b: 34567,
  360. c: 890,
  361. d: [1,2,3,4,5],
  362. };
  363. let mut bytes = test.as_bytes();
  364. assert!(bytes == vec![12, 7, 135, 0, 0, 122, 3, 1, 2, 3, 4, 5]);
  365. bytes[10] = 17;
  366. let mut cur = std::io::Cursor::new(bytes.clone());
  367. let test2 = Test::from_bytes(&mut cur).unwrap();
  368. assert!(test2 == Test {
  369. a: 12,
  370. b: 34567,
  371. c: 890,
  372. d: [1,2,3,17,5]
  373. });
  374. }
  375. #[test]
  376. fn test_derive_pso_data_packet_not_enough_data() {
  377. #[derive(PSOPacketData)]
  378. struct Test {
  379. a: u8,
  380. b: u32,
  381. c: u16,
  382. }
  383. let test = Test {
  384. a: 12,
  385. b: 34567,
  386. c: 890,
  387. };
  388. let mut bytes = test.as_bytes();
  389. bytes.extend(test.as_bytes());
  390. let mut cur = std::io::Cursor::new(bytes.clone());
  391. let test2 = Test::from_bytes(&mut cur).unwrap();
  392. assert!(test2 == Test {
  393. a: 12,
  394. b: 34567,
  395. c: 890,
  396. });
  397. let bytes2 = (0..14).collect::<Vec<_>>();
  398. let mut cur = std::io::Cursor::new(bytes2);
  399. let test3 = Test::from_bytes(&mut cur);
  400. assert!(test3 == Ok(Test {
  401. a: 0,
  402. b: 67305985,
  403. c: 1541,
  404. }));
  405. let test4 = Test::from_bytes(&mut cur);
  406. assert!(test4 == Ok(Test {
  407. a: 7,
  408. b: 185207048,
  409. c: 3340,
  410. }));
  411. let test5 = Test::from_bytes(&mut cur);
  412. assert!(test5 == Err(PacketParseError::NotEnoughBytes));
  413. }
  414. #[test]
  415. fn test_pso_packet_manual_flag() {
  416. #[pso_packet(0x23, manual_flag)]
  417. struct Test {
  418. flag: u32,
  419. a: u32,
  420. b: u32,
  421. }
  422. let test = Test {
  423. flag: 99,
  424. a: 123,
  425. b: 456,
  426. };
  427. let mut bytes = test.as_bytes();
  428. assert!(bytes == vec![16, 0, 35, 0, 99, 0, 0, 0, 123, 0, 0, 0, 200, 1, 0, 0]);
  429. bytes[6] = 2;
  430. let test2 = Test::from_bytes(&bytes).unwrap();
  431. assert!(test2 == Test {
  432. flag: 131171,
  433. a: 123,
  434. b: 456,
  435. });
  436. }
  437. #[test]
  438. fn test_pso_message() {
  439. #[pso_message(0x23)]
  440. struct Test {
  441. a: u32,
  442. b: f32,
  443. }
  444. let test = Test {
  445. client: 1,
  446. target: 2,
  447. a: 123,
  448. b: 4.56,
  449. };
  450. let mut bytes = test.as_bytes();
  451. assert!(bytes == vec![35, 3, 1, 2, 123, 0, 0, 0, 133, 235, 145, 64]);
  452. bytes[6] = 2;
  453. let test2 = Test::from_bytes(&mut std::io::Cursor::new(bytes)).unwrap();
  454. assert!(test2 == Test {
  455. client: 1,
  456. target: 2,
  457. a: 131195,
  458. b: 4.56,
  459. });
  460. }
  461. #[test]
  462. fn test_pso_message_non_4_byte_size() {
  463. #[pso_message(0x23)]
  464. struct Test {
  465. a: u32,
  466. b: f32,
  467. c: u8,
  468. }
  469. let test = Test {
  470. client: 1,
  471. target: 2,
  472. a: 123,
  473. b: 4.56,
  474. c: 5,
  475. };
  476. let mut bytes = test.as_bytes();
  477. assert!(bytes == vec![35, 4, 1, 2, 123, 0, 0, 0, 133, 235, 145, 64, 5, 0, 0, 0]);
  478. bytes[6] = 2;
  479. let test2 = Test::from_bytes(&mut std::io::Cursor::new(bytes)).unwrap();
  480. assert!(test2 == Test {
  481. client: 1,
  482. target: 2,
  483. a: 131195,
  484. b: 4.56,
  485. c: 5,
  486. });
  487. }
  488. #[test]
  489. fn test_pso_message_overflow() {
  490. #[pso_message(0x23)]
  491. struct Test {
  492. b: [u32; 100],
  493. }
  494. let test = Test {
  495. client: 1,
  496. target: 2,
  497. b: [23; 100],
  498. };
  499. let bytes = test.as_bytes();
  500. assert!(bytes[1] == 101);
  501. }
  502. #[test]
  503. fn test_consuming_blob() {
  504. #[pso_packet(0x6D, manual_flag)]
  505. struct SixDee {
  506. flag: u32,
  507. blob: ConsumingBlob,
  508. }
  509. let pkt = vec![76, 0, 109, 0, 1, 0, 0, 0, 109, 0, 0, 0, 68, 0, 0, 0, 140, 0, 0, 0,
  510. 51, 0, 0, 0, 84, 220, 255, 254, 253, 1, 254, 240, 33, 254, 240,
  511. 65, 254, 240, 85, 97, 254, 240, 129, 254, 240, 161, 254, 240, 193,
  512. 254, 240, 169, 225, 13, 1, 16, 0, 33, 16, 0, 65, 16, 0, 97, 0, 16,
  513. 1, 64, 15, 82, 15, 100, 15, 118, 0, 0];
  514. let data = SixDee::from_bytes(&pkt);
  515. assert!(pkt == data.unwrap().as_bytes());
  516. }
  517. #[test]
  518. fn test_message_length() {
  519. #[pso_message(0x23)]
  520. struct Lengths {
  521. a: u8,
  522. #[length_of(d)]
  523. b: u8,
  524. c: u8,
  525. #[length_is(b)]
  526. d: Vec<u8>,
  527. }
  528. let pkt = Lengths {
  529. client: 1,
  530. target: 2,
  531. a: 12,
  532. b: 23,
  533. c: 34,
  534. d: vec![9,9,9],
  535. };
  536. let mut data = pkt.as_bytes();
  537. assert!(data == vec![35, 3, 1, 2, 12, 3, 34, 9, 9, 9, 0, 0]);
  538. data[10] = 8;
  539. data[5] = 4;
  540. let l = Lengths::from_bytes(&mut std::io::Cursor::new(data)).unwrap();
  541. assert!(l == Lengths {
  542. client: 1,
  543. target: 2,
  544. a: 12,
  545. b: 4,
  546. c: 34,
  547. d: vec![9,9,9,8],
  548. });
  549. }
  550. }