Advertisement
Guest User

Untitled

a guest
Sep 25th, 2016
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.14 KB | None | 0 0
  1. package com.rs.net.decoders;
  2.  
  3. import com.rs.Settings;
  4. import com.rs.cache.Cache;
  5. import com.rs.game.World;
  6. import com.rs.game.player.Player;
  7. import com.rs.io.AntiFlood;
  8. import com.rs.io.InputStream;
  9. import com.rs.net.Session;
  10. import com.rs.utils.Logger;
  11. import com.rs.utils.SerializableFilesManager;
  12. import com.rs.utils.Utils;
  13. import java.io.File;
  14. import com.rs.net.ForumIntegration;
  15. import com.rs.utils.WriteFile;
  16. import com.rs.utils.MacBanL;
  17.  
  18. import java.util.List;
  19. import java.util.ArrayList;
  20.  
  21. public final class LoginPacketsDecoder extends Decoder {
  22.  
  23. public LoginPacketsDecoder(Session session) {
  24. super(session);
  25. }
  26.  
  27. @Override
  28. public void decode(InputStream stream) {
  29. session.setDecoder(-1);
  30. int packetId = stream.readUnsignedByte();
  31. if(packetId == 19)
  32. decodeLobbyLogin(stream);
  33. else if (packetId == 16) // 16 world login
  34. decodeWorldLogin(stream);
  35. else {
  36. if (Settings.DEBUG)
  37. Logger.log(this, "PacketId " + packetId);
  38. session.getChannel().close();
  39. }
  40. }
  41.  
  42. public static List<String> IPS = new ArrayList<String>();
  43.  
  44. private void decodeLobbyLogin(InputStream buffer) {
  45.  
  46.  
  47.  
  48.  
  49. int clientRev = buffer.readInt();
  50. int rsaBlockSize = buffer.readShort(); // RSA block sizeF
  51. int rsaHeaderKey = buffer.readByte(); // RSA header key
  52. System.out.println(" "+rsaBlockSize+" "+rsaHeaderKey+" "+clientRev);
  53.  
  54. int[] loginKeys = new int[4];
  55. for (int data = 0; data < 4; data++) {
  56. loginKeys[data] = buffer.readInt();
  57. }
  58. buffer.readLong();
  59. String pass = buffer.readString();
  60. @SuppressWarnings("unused")
  61. long serverSeed = buffer.readLong();
  62. @SuppressWarnings("unused")
  63. long clientSeed = buffer.readLong();
  64.  
  65. buffer.decodeXTEA(loginKeys, buffer.getOffset(),
  66. buffer.getLength());
  67. String name = buffer.readString();
  68. boolean isHD = buffer.readByte() == 1;
  69. boolean isResizable = buffer.readByte() == 1;
  70. System.out.println(" Is resizable? "+isResizable);
  71. for (int i = 0; i < 24; i++)
  72. buffer.readByte();
  73. String settings = buffer.readString();
  74.  
  75. @SuppressWarnings("unused")
  76. int unknown = buffer.readInt();
  77. int[] crcValues = new int[35];
  78. for (int i = 0; i < crcValues.length; i++)
  79. crcValues[i] = buffer.readInt();
  80. System.out.println(name+", "+pass);
  81. Player player;
  82.  
  83. if (!SerializableFilesManager
  84. .containsPlayer(name)) {
  85. player = new Player(name);
  86. player.setPassword(pass);
  87.  
  88. //session.getLoginPackets().sendClientPacket(2);
  89. //return;
  90. } else {
  91. player = SerializableFilesManager
  92. .loadPlayer(name);
  93. if (player == null) {
  94. session.getLoginPackets()
  95. .sendClientPacket(20);
  96. return;
  97. }
  98. if (!player.getPassword().equals(pass)) {
  99. session.getLoginPackets()
  100. .sendClientPacket(3);
  101. return;
  102. }
  103. }
  104. if (player.isPermBanned()
  105. || (player.getBanned()
  106. > System.currentTimeMillis()))
  107. session.getLoginPackets()
  108. .sendClientPacket(4);
  109. else {
  110. player.init(session, name);
  111. session.getLoginPackets().sendLobbyDetails(player);//sendLoginDetails(player);
  112. session.setDecoder(3, player);
  113. session.setEncoder(2, player);
  114. SerializableFilesManager.savePlayer(player);
  115.  
  116. //player.start();
  117. }
  118. }
  119.  
  120.  
  121. public void decodeWorldLogin(InputStream stream) {
  122. if(IPS == null)
  123. IPS = new ArrayList<String>();
  124. System.out.println("login attempt");
  125. if (World.exiting_start != 0) {
  126. session.getLoginPackets().sendClientPacket(14);
  127. return;
  128. }
  129. int packetSize = stream.readUnsignedShort();
  130. if (packetSize != stream.getRemaining()) {
  131. session.getChannel().close();
  132. return;
  133. }
  134. if (stream.readInt() != Settings.CLIENT_BUILD || stream.readInt() != Settings.CUSTOM_CLIENT_BUILD) {
  135. session.getLoginPackets().sendClientPacket(6);
  136. return;
  137. }
  138. String macaddress = stream.readString();
  139. @SuppressWarnings("unused")
  140. boolean unknownEquals14 = stream.readUnsignedByte() == 1;
  141. int unByte = stream.readUnsignedByte();
  142. if (unByte != 10) { // rsa block check
  143. System.out.println("RSA block. Byte: "+unByte);
  144. session.getLoginPackets().sendClientPacket(10);
  145. return;
  146. }
  147. int[] isaacKeys = new int[4];
  148. for (int i = 0; i < isaacKeys.length; i++)
  149. isaacKeys[i] = stream.readInt();
  150. long long1 = stream.readLong();
  151. if (long1 != 0L) { // rsa block check, pass part
  152. session.getLoginPackets().sendClientPacket(10);
  153. return;
  154. }
  155. String password = stream.readString();
  156. @SuppressWarnings("unused")
  157. String unknown = Utils.longToString(stream.readLong());
  158. stream.readLong(); // random value
  159. stream.decodeXTEA(isaacKeys, stream.getOffset(), stream.getLength());
  160. String username = Utils
  161. .formatPlayerNameForProtocol(stream.readString());
  162. stream.readUnsignedByte();
  163. int displayMode = stream.readUnsignedByte();
  164. int screenWidth = stream.readUnsignedShort();
  165. int screenHeight = stream.readUnsignedShort();
  166. int customInt = stream.readInt();
  167. if(customInt == 12) {
  168. @SuppressWarnings("unused")
  169. int unknown2 = stream.readUnsignedByte();
  170. }
  171. stream.skip(24); // 24bytes directly from a file, no idea whats ther
  172. @SuppressWarnings("unused")
  173. String settings = stream.readString();
  174. @SuppressWarnings("unused")
  175. int affid = stream.readInt();
  176. stream.skip(stream.readUnsignedByte()); // useless settings
  177. int unByte1 = stream.readUnsignedByte();
  178. /*if (unByte1 != 5) {
  179. session.getLoginPackets().sendClientPacket(10);
  180. return;
  181. }*/
  182. stream.readUnsignedByte();
  183. stream.readUnsignedByte();
  184. stream.readUnsignedByte();
  185. stream.readUnsignedByte();
  186. stream.readUnsignedByte();
  187. stream.readUnsignedByte();
  188. stream.readUnsignedByte();
  189. stream.readUnsignedByte();
  190. stream.readUnsignedShort();
  191. stream.readUnsignedByte();
  192. stream.read24BitInt();
  193. stream.readUnsignedShort();
  194. stream.readUnsignedByte();
  195. stream.readUnsignedByte();
  196. stream.readUnsignedByte();
  197. stream.readJagString();
  198. stream.readJagString();
  199. stream.readJagString();
  200. stream.readJagString();
  201. stream.readUnsignedByte();
  202. stream.readUnsignedShort();
  203. @SuppressWarnings("unused")
  204. int unknown3 = stream.readInt();
  205. @SuppressWarnings("unused")
  206. long userFlow = stream.readLong();
  207. boolean hasAditionalInformation = stream.readUnsignedByte() == 1;
  208. if (hasAditionalInformation)
  209. stream.readString(); // aditionalInformation
  210. @SuppressWarnings("unused")
  211. boolean hasJagtheora = stream.readUnsignedByte() == 1;
  212. @SuppressWarnings("unused")
  213. boolean js = stream.readUnsignedByte() == 1;
  214. @SuppressWarnings("unused")
  215. boolean hc = stream.readUnsignedByte() == 1;
  216. for (int index = 0; index < Cache.STORE.getIndexes().length; index++) {
  217. int crc = Cache.STORE.getIndexes()[index] == null ? 0 : Cache.STORE
  218. .getIndexes()[index].getCRC();
  219. int receivedCRC = stream.readInt();
  220. if (crc != receivedCRC && index < 32) {
  221. // Logger.log(this,
  222. // "Invalid CRC at index: "+index+", "+receivedCRC+", "+crc);
  223. session.getLoginPackets().sendClientPacket(6);
  224. return;
  225. }
  226. }
  227. System.out.println("Custom Int: "+customInt);
  228. // invalid chars
  229. if ((username.length() <= 0 || username.length() >= 13
  230. || username.contains("?") || username.contains(":")
  231. || username.contains("#") || username.contains("%")
  232. || username.contains("&") || username.contains("%")
  233. || username.contains(".") || username.contains(",")
  234. || username.startsWith(" ") || username.endsWith(" ")
  235. || username.contains(" ") || username.endsWith("_")
  236. || username.endsWith(" ") || username.endsWith("<")
  237. || username.contains("/") || username.contains("\\")
  238. || username.contains("*") || username.contains("\""))) {
  239. session.getLoginPackets().sendClientPacket(3);//3
  240. return;
  241. }
  242. if(username.contains("___")) {
  243. session.getLoginPackets().sendClientPacket(3);
  244. return;
  245. }
  246. if(username.startsWith("_") || username.startsWith("__")) {
  247. session.getLoginPackets().sendClientPacket(3);
  248. return;
  249. }
  250. if (!username.matches("^[a-z0-9_ ]{1,13}$")) {
  251. session.getLoginPackets().sendClientPacket(3);
  252. return;
  253. }
  254. if (username.contains("dragonkk")) {
  255. session.getLoginPackets().sendClientPacket(20);
  256. return;
  257. }
  258. /*if (World.getPlayers().size() >= Settings.PLAYERS_LIMIT - 10) {
  259. session.getLoginPackets().sendClientPacket(7);
  260. return;
  261. }*/
  262. if (AntiFlood.getSessionsIP(session.getIP()) > 5) {
  263. session.getLoginPackets().sendClientPacket(9);
  264. return;
  265. }
  266. if (World.containsPlayer(username)) {
  267. session.getLoginPackets().sendClientPacket(5);
  268. return;
  269. }
  270. File file = new File("C:/data/loggedIn/"+username+""+Settings.getWorld());
  271. File main = new File("C:/data/loggedIn/"+username+"MAIN");
  272. File pvp = new File("C:/data/loggedIn/"+username+"PVP");
  273. File admin = new File("C:/data/loggedIn/"+username+"ADMIN");
  274. if((main.exists() /*|| pvp.exists()*/ || admin.exists()) && !Settings.isArcadeWorld()) {
  275. session.getLoginPackets().sendClientPacket(5);
  276. return;
  277. }
  278. if (MacBanL.isBanned(macaddress)) {
  279. session.getLoginPackets().sendClientPacket(4);
  280. WriteFile.writeGlobalLog(username+" tried to login with banned MAC address.", "bannedloginattempts", "bannedloginattempts");
  281. return;
  282. }
  283. if(macaddress.length() < 17) {
  284. WriteFile.writeGlobalLog(username+" tried to login with a forged MAC address", "forgedMACS", "forgedMACS");
  285. return;
  286. }
  287. Player player = null;
  288. if (!SerializableFilesManager.containsPlayer(username)) {
  289. if(IPS.contains(session.getIP())) {
  290. session.getLoginPackets().sendClientPacket(9);
  291. return;
  292. }
  293. if(Settings.isAdminWorld()) {
  294. session.getLoginPackets().sendClientPacket(20);
  295. return;
  296. }
  297. if(username.length() < 3) {
  298. session.getLoginPackets().sendClientPacket(3);
  299. return;
  300. }
  301. player = new Player(password);
  302. //IPS.add(session.getIP());
  303. //IPS.add(session.getIP());
  304. } else {
  305. player = SerializableFilesManager.loadPlayer(username);
  306. if (player == null) {
  307. session.getLoginPackets().sendClientPacket(20);
  308. return;
  309. }
  310. if(Settings.isAdminWorld()) {
  311. if((player.getRights() < 2 || player.getRights() > 2) && !player.isDeveloper && !player.isBetaTester) {
  312. session.getLoginPackets().sendClientPacket(20);
  313. return;
  314. }
  315. }
  316. /*if(!player.processMasks()) {
  317. session.getLoginPackets().sendClientPacket(20);
  318. return;
  319. }*/
  320. if (!SerializableFilesManager.createBackup(username)) {
  321. session.getLoginPackets().sendClientPacket(20);
  322. return;
  323. }
  324. if (!player.getPassword().equals(password)) {
  325. session.getLoginPackets().sendClientPacket(3);
  326. return;
  327. }
  328. }
  329. if(player != null) {
  330. if (player.isPermBanned()
  331. || player.getBanned() > Utils.currentTimeMillis()) {
  332. if(player.banReset == false) {
  333. player.setBanned(0);
  334. player.banReason = "Unbanned.";
  335. player.setPermBanned(false);
  336. } else {
  337. // session.getWorldPackets().sendClientWarning("This account has been banned. Reason: "+player.banReason);
  338. WriteFile.writeGlobalLog(username+" tried to login with banned account.", "bannedloginattempts", "bannedloginattempts");
  339. session.getLoginPackets().sendClientPacket(4);
  340. return;
  341. }
  342. }
  343. player.banReset = true;
  344. }
  345. /*if(!username.equals("luke")) {
  346. System.out.print("DENYING LOGIN ATTEMPT FOR: "+username);
  347. return;
  348. }*/
  349. /*if(Settings.isArcadeWorld()) {
  350. int code = ForumIntegration.checkUser(player, username, password);
  351. System.out.println("Code: "+code);
  352. if(code == -1 || code == 11) {
  353. session.getLoginPackets().sendClientPacket(20);
  354. return;
  355. }
  356. if(code == 3) {
  357. session.getLoginPackets().sendClientPacket(3);
  358. return;
  359. }
  360. if(code == 4) {
  361. session.getLoginPackets().sendClientPacket(4);
  362. return;
  363. }
  364. }*/
  365. file.mkdir();
  366. player.init(session, username, displayMode, screenWidth, screenHeight);
  367. session.getLoginPackets().sendLoginDetails(player);
  368. session.setDecoder(3, player);
  369. session.setEncoder(2, player);
  370. player.start();
  371. player.macaddress = macaddress;
  372. player.bottingInt = customInt;
  373. WriteFile.writePlayerLog(username+" Signed in with client ID: "+customInt, "clientints", player);
  374. WriteFile.writePlayerLog(username+" Signed in with Mac Address: "+macaddress, "macaddress", player);
  375. }
  376.  
  377. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement