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.

619 lines
15 KiB

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