BezneR

L2Proxy

Apr 20th, 2021
665
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 18.85 KB | None | 0 0
  1. ### Eclipse Workspace Patch 1.0
  2. #P aCis_gameserver
  3. Index: java/net/sf/l2j/loginserver/network/loginserverpackets/PlayerAuthResponse.java
  4. ===================================================================
  5. --- java/net/sf/l2j/loginserver/network/loginserverpackets/PlayerAuthResponse.java  (revision 9)
  6. +++ java/net/sf/l2j/loginserver/network/loginserverpackets/PlayerAuthResponse.java  (working copy)
  7. @@ -4,11 +4,12 @@
  8.  
  9.  public class PlayerAuthResponse extends ServerBasePacket
  10.  {
  11. -   public PlayerAuthResponse(String account, boolean response)
  12. +   public PlayerAuthResponse(String account, boolean response, String realIp)
  13.     {
  14.         writeC(0x03);
  15.         writeS(account);
  16.         writeC(response ? 1 : 0);
  17. +       writeS(realIp);
  18.     }
  19.    
  20.     @Override
  21. Index: java/net/sf/l2j/loginserver/data/xml/L2ProxyData.java
  22. ===================================================================
  23. --- java/net/sf/l2j/loginserver/data/xml/L2ProxyData.java   (nonexistent)
  24. +++ java/net/sf/l2j/loginserver/data/xml/L2ProxyData.java   (working copy)
  25. @@ -0,0 +1,77 @@
  26. +package net.sf.l2j.loginserver.data.xml;
  27. +
  28. +import net.sf.l2j.commons.data.xml.IXmlReader;
  29. +import net.sf.l2j.commons.logging.CLogger;
  30. +import net.sf.l2j.loginserver.model.L2Proxy;
  31. +import org.w3c.dom.Document;
  32. +
  33. +import java.net.UnknownHostException;
  34. +import java.nio.file.Path;
  35. +import java.util.Collection;
  36. +import java.util.HashMap;
  37. +import java.util.Map;
  38. +
  39. +public class L2ProxyData implements IXmlReader
  40. +{    
  41. +    private static final CLogger LOGGER = new CLogger(L2ProxyData.class.getName());
  42. +    private final Map<Integer, L2Proxy> _proxyServers = new HashMap<>();
  43. +    
  44. +    public L2Proxy getProxyById(int proxyId)
  45. +    {
  46. +        return _proxyServers.get(proxyId);
  47. +    }
  48. +    
  49. +    public Collection<L2Proxy> getProxies()
  50. +    {
  51. +        return _proxyServers.values();
  52. +    }
  53. +    
  54. +    @Override
  55. +    public void load()
  56. +    {
  57. +        parseFile("./config/proxy.xml");
  58. +        LOGGER.info("Loaded {} proxy servers.", _proxyServers.size());
  59. +    }
  60. +
  61. +    @Override
  62. +    public void parseDocument(Document doc, Path path)
  63. +    {
  64. +        forEach(doc, "list", listNode ->
  65. +        {
  66. +            forEach(listNode, "gameserver", gameserverNode ->
  67. +            {
  68. +                final var gameserverSet = parseAttributes(gameserverNode);
  69. +                var serverId = gameserverSet.getInteger("serverId");
  70. +                var hidesGameserver = gameserverSet.getBool("hide");
  71. +                
  72. +                forEach(gameserverNode, "proxy", proxyNode -> {
  73. +                    final var proxySet = parseAttributes(proxyNode);
  74. +                    try
  75. +                    {
  76. +                        final var proxy = new L2Proxy(
  77. +                                serverId,
  78. +                                proxySet.getInteger("proxyServerId"),
  79. +                                proxySet.getString("proxyHost"),
  80. +                                proxySet.getInteger("proxyPort"),
  81. +                                hidesGameserver);
  82. +                        _proxyServers.put(proxySet.getInteger("proxyServerId"), proxy);
  83. +                    }
  84. +                    catch (UnknownHostException ex)
  85. +                    {
  86. +                        LOGGER.warn("Failed to process proxy due to badly formatted proxy host", ex);
  87. +                    }
  88. +                });                
  89. +            });
  90. +        });
  91. +    }
  92. +    
  93. +    public static L2ProxyData getInstance()
  94. +    {
  95. +        return L2ProxyData.SingletonHolder.INSTANCE;
  96. +    }
  97. +
  98. +    private static class SingletonHolder
  99. +    {
  100. +        protected static final L2ProxyData INSTANCE = new L2ProxyData();
  101. +    }
  102. +}
  103. \ No newline at end of file
  104. Index: config/proxy.xml
  105. ===================================================================
  106. --- config/proxy.xml    (nonexistent)
  107. +++ config/proxy.xml    (working copy)
  108. @@ -0,0 +1,6 @@
  109. +<?xml version='1.0' encoding='utf-8'?>
  110. +<list>
  111. +    <gameserver serverId="1" hide="true">
  112. +        <proxy proxyServerId="2" proxyHost="127.0.0.1" proxyPort="7778"/>
  113. +    </gameserver>
  114. +</list>
  115. \ No newline at end of file
  116. Index: java/net/sf/l2j/gameserver/network/GameClient.java
  117. ===================================================================
  118. --- java/net/sf/l2j/gameserver/network/GameClient.java  (revision 9)
  119. +++ java/net/sf/l2j/gameserver/network/GameClient.java  (working copy)
  120. @@ -93,6 +93,7 @@
  121.    
  122.     protected final ScheduledFuture<?> _autoSaveInDB;
  123.     protected ScheduledFuture<?> _cleanupTask;
  124. +   private String _realIpAddress;
  125.    
  126.     public GameClient(MMOConnection<GameClient> con)
  127.     {
  128. @@ -330,6 +331,16 @@
  129.         return _sessionId;
  130.     }
  131.    
  132. +   public String getRealIpAddress()
  133. +   {
  134. +       return _realIpAddress;
  135. +   }
  136. +      
  137. +   public void setRealIpAddress(String realIpAddress)
  138. +   {
  139. +       _realIpAddress = realIpAddress;
  140. +   }
  141. +  
  142.     public void sendPacket(L2GameServerPacket gsp)
  143.     {
  144.         if (_isDetached)
  145. Index: build.xml
  146. ===================================================================
  147. --- build.xml   (revision 9)
  148. +++ build.xml   (working copy)
  149. @@ -43,6 +43,9 @@
  150.         <mkdir dir="${build.dist.game}/log" />
  151.         <mkdir dir="${build.dist.login}/log" />
  152.         <mkdir dir="${build.dist.game}/config" />
  153. +       <mkdir dir="${build.dist.game}/config/customs" />
  154. +       <mkdir dir="${build.dist.game}/config/en" />
  155. +       <mkdir dir="${build.dist.game}/config/en/customs" />
  156.         <mkdir dir="${build.dist.login}/config" />
  157.         <copy todir="${build.dist.game}/config">
  158.             <fileset dir="config">
  159. @@ -51,11 +54,27 @@
  160.                 <exclude name="loginserver.properties" />
  161.             </fileset>
  162.         </copy>
  163. +       <copy todir="${build.dist.game}/config/customs">   
  164. +           <fileset dir="config/customs"> 
  165. +               <include name="*.properties" />
  166. +           </fileset> 
  167. +       </copy>
  168. +       <copy todir="${build.dist.game}/config/en">
  169. +           <fileset dir="config/en">  
  170. +               <include name="*.properties" />
  171. +           </fileset> 
  172. +       </copy>
  173. +       <copy todir="${build.dist.game}/config/en/customs">
  174. +           <fileset dir="config/customs"> 
  175. +               <include name="*.properties" />
  176. +           </fileset> 
  177. +       </copy>
  178.         <copy todir="${build.dist.login}/config">
  179.             <fileset dir="config">
  180.                 <include name="banned_ips.properties" />
  181.                 <include name="logging.properties" />
  182.                 <include name="loginserver.properties" />
  183. +               <include name="proxy.xml" />
  184.             </fileset>
  185.         </copy>
  186.         <mkdir dir="${build.dist.game}/data" />
  187. Index: java/net/sf/l2j/gameserver/network/loginserverpackets/PlayerAuthResponse.java
  188. ===================================================================
  189. --- java/net/sf/l2j/gameserver/network/loginserverpackets/PlayerAuthResponse.java   (revision 9)
  190. +++ java/net/sf/l2j/gameserver/network/loginserverpackets/PlayerAuthResponse.java   (working copy)
  191. @@ -4,6 +4,7 @@
  192.  {
  193.     private final String _account;
  194.     private final boolean _authed;
  195. +   private final String _realIpAddress;
  196.    
  197.     public PlayerAuthResponse(byte[] decrypt)
  198.     {
  199. @@ -11,6 +12,7 @@
  200.        
  201.         _account = readS();
  202.         _authed = readC() != 0;
  203. +       _realIpAddress = readS();
  204.     }
  205.    
  206.     public String getAccount()
  207. @@ -22,4 +24,9 @@
  208.     {
  209.         return _authed;
  210.     }
  211. +  
  212. +   public String getRealIpAddress()
  213. +   {
  214. +       return _realIpAddress;
  215. +   }
  216.  }
  217. \ No newline at end of file
  218. Index: java/net/sf/l2j/loginserver/LoginServer.java
  219. ===================================================================
  220. --- java/net/sf/l2j/loginserver/LoginServer.java    (revision 9)
  221. +++ java/net/sf/l2j/loginserver/LoginServer.java    (working copy)
  222. @@ -18,6 +18,7 @@
  223.  import net.sf.l2j.loginserver.data.manager.GameServerManager;
  224.  import net.sf.l2j.loginserver.data.manager.IpBanManager;
  225.  import net.sf.l2j.loginserver.data.sql.AccountTable;
  226. +import net.sf.l2j.loginserver.data.xml.L2ProxyData;
  227.  import net.sf.l2j.loginserver.network.LoginClient;
  228.  import net.sf.l2j.loginserver.network.LoginPacketHandler;
  229.  
  230. @@ -64,6 +65,9 @@
  231.         StringUtil.printSection("GameServerManager");
  232.         GameServerManager.getInstance();
  233.        
  234. +       StringUtil.printSection("L2Proxy");
  235. +       L2ProxyData.getInstance().load();
  236. +      
  237.         StringUtil.printSection("Ban List");
  238.         IpBanManager.getInstance();
  239.        
  240. Index: java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEditChar.java
  241. ===================================================================
  242. --- java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEditChar.java  (revision 9)
  243. +++ java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEditChar.java  (working copy)
  244. @@ -571,7 +571,7 @@
  245.         html.replace("%nextai%", targetPlayer.getAI().getNextIntention().getType().toString());
  246.         html.replace("%loc%", targetPlayer.getPosition().toString());
  247.         html.replace("%account%", targetPlayer.getAccountName());
  248. -       html.replace("%ip%", (targetPlayer.getClient().isDetached()) ? "Disconnected" : targetPlayer.getClient().getConnection().getInetAddress().getHostAddress());
  249. +       html.replace("%ip%", (targetPlayer.getClient().isDetached()) ? "Disconnected" : targetPlayer.getClient().getRealIpAddress());
  250.     }
  251.    
  252.     /**
  253. Index: java/net/sf/l2j/gameserver/LoginServerThread.java
  254. ===================================================================
  255. --- java/net/sf/l2j/gameserver/LoginServerThread.java   (revision 9)
  256. +++ java/net/sf/l2j/gameserver/LoginServerThread.java   (working copy)
  257. @@ -225,6 +225,7 @@
  258.                             final GameClient client = _clients.get(par.getAccount());
  259.                             if (client != null)
  260.                             {
  261. +                               client.setRealIpAddress(par.getRealIpAddress());
  262.                                 if (par.isAuthed())
  263.                                 {
  264.                                     sendPacket(new PlayerInGame(par.getAccount()));
  265. Index: java/net/sf/l2j/loginserver/model/Account.java
  266. ===================================================================
  267. --- java/net/sf/l2j/loginserver/model/Account.java  (revision 9)
  268. +++ java/net/sf/l2j/loginserver/model/Account.java  (working copy)
  269. @@ -4,6 +4,7 @@
  270.  
  271.  import net.sf.l2j.loginserver.data.manager.GameServerManager;
  272.  import net.sf.l2j.loginserver.data.sql.AccountTable;
  273. +import net.sf.l2j.loginserver.data.xml.L2ProxyData;
  274.  
  275.  public final class Account
  276.  {
  277. @@ -42,7 +43,12 @@
  278.    
  279.     public final boolean isLoginPossible(int serverId)
  280.     {
  281. -       final GameServerInfo gsi = GameServerManager.getInstance().getRegisteredGameServers().get(serverId);
  282. +       GameServerInfo gsi = GameServerManager.getInstance().getRegisteredGameServers().get(serverId);
  283. +       L2Proxy proxy = L2ProxyData.getInstance().getProxyById(serverId);
  284. +              
  285. +       if(gsi == null && proxy != null)
  286. +           gsi = GameServerManager.getInstance().getRegisteredGameServers().get(proxy.getGameserverId());
  287. +      
  288.         if (gsi == null || !gsi.isAuthed())
  289.             return false;
  290.        
  291. Index: java/net/sf/l2j/loginserver/network/serverpackets/ServerList.java
  292. ===================================================================
  293. --- java/net/sf/l2j/loginserver/network/serverpackets/ServerList.java   (revision 9)
  294. +++ java/net/sf/l2j/loginserver/network/serverpackets/ServerList.java   (working copy)
  295. @@ -3,13 +3,17 @@
  296.  import java.net.InetAddress;
  297.  import java.net.UnknownHostException;
  298.  import java.util.ArrayList;
  299. +import java.util.Comparator;
  300.  import java.util.List;
  301. +import java.util.stream.Collectors;
  302.  
  303.  import net.sf.l2j.commons.network.ServerType;
  304.  
  305.  import net.sf.l2j.loginserver.data.manager.GameServerManager;
  306. +import net.sf.l2j.loginserver.data.xml.L2ProxyData;
  307.  import net.sf.l2j.loginserver.model.Account;
  308.  import net.sf.l2j.loginserver.model.GameServerInfo;
  309. +import net.sf.l2j.loginserver.model.L2Proxy;
  310.  import net.sf.l2j.loginserver.model.ServerData;
  311.  
  312.  public final class ServerList extends L2LoginServerPacket
  313. @@ -16,6 +20,8 @@
  314.  {
  315.     private final List<ServerData> _servers = new ArrayList<>();
  316.    
  317. +   private static final Comparator<ServerData> SERVER_DATA_COMPARATOR = Comparator.comparingInt(ServerData::getServerId);
  318. +  
  319.     private final int _lastServer;
  320.    
  321.     public ServerList(Account account)
  322. @@ -27,7 +33,20 @@
  323.             final ServerType type = (account.getAccessLevel() < 0 || (gsi.getType() == ServerType.GM_ONLY && account.getAccessLevel() <= 0)) ? ServerType.DOWN : gsi.getType();
  324.             final String hostName = gsi.getHostName();
  325.            
  326. -           _servers.add(new ServerData(type, hostName, gsi));
  327. +           var proxiesForGameserver = L2ProxyData.getInstance().getProxies().stream()
  328. +               .filter(x -> x.getGameserverId() == gsi.getId()).collect(Collectors.toList());
  329. +                          
  330. +           if(proxiesForGameserver.stream().noneMatch(L2Proxy::hidesGameserver))
  331. +           {
  332. +               _servers.add(new ServerData(type, hostName, gsi));
  333. +           }
  334. +              
  335. +           proxiesForGameserver.forEach(l2Proxy ->
  336. +           {
  337. +               _servers.add(new ServerData(type, l2Proxy.getProxyServerId(), l2Proxy.getProxyAddress().getHostAddress(), l2Proxy.getProxyPort(), gsi));
  338. +           });
  339. +                      
  340. +           _servers.sort(SERVER_DATA_COMPARATOR);
  341.         }
  342.     }
  343.    
  344. Index: java/net/sf/l2j/loginserver/data/xml/L2ProxyData.java
  345. ===================================================================
  346. --- java/net/sf/l2j/loginserver/data/xml/L2ProxyData.java   (nonexistent)
  347. +++ java/net/sf/l2j/loginserver/data/xml/L2ProxyData.java   (working copy)
  348. @@ -0,0 +1,77 @@
  349. +package net.sf.l2j.loginserver.data.xml;
  350. +
  351. +import net.sf.l2j.commons.data.xml.IXmlReader;
  352. +import net.sf.l2j.commons.logging.CLogger;
  353. +import net.sf.l2j.loginserver.model.L2Proxy;
  354. +import org.w3c.dom.Document;
  355. +
  356. +import java.net.UnknownHostException;
  357. +import java.nio.file.Path;
  358. +import java.util.Collection;
  359. +import java.util.HashMap;
  360. +import java.util.Map;
  361. +
  362. +public class L2ProxyData implements IXmlReader
  363. +{    
  364. +    private static final CLogger LOGGER = new CLogger(L2ProxyData.class.getName());
  365. +    private final Map<Integer, L2Proxy> _proxyServers = new HashMap<>();
  366. +    
  367. +    public L2Proxy getProxyById(int proxyId)
  368. +    {
  369. +        return _proxyServers.get(proxyId);
  370. +    }
  371. +    
  372. +    public Collection<L2Proxy> getProxies()
  373. +    {
  374. +        return _proxyServers.values();
  375. +    }
  376. +    
  377. +    @Override
  378. +    public void load()
  379. +    {
  380. +        parseFile("./config/proxy.xml");
  381. +        LOGGER.info("Loaded {} proxy servers.", _proxyServers.size());
  382. +    }
  383. +
  384. +    @Override
  385. +    public void parseDocument(Document doc, Path path)
  386. +    {
  387. +        forEach(doc, "list", listNode ->
  388. +        {
  389. +            forEach(listNode, "gameserver", gameserverNode ->
  390. +            {
  391. +                final var gameserverSet = parseAttributes(gameserverNode);
  392. +                var serverId = gameserverSet.getInteger("serverId");
  393. +                var hidesGameserver = gameserverSet.getBool("hide");
  394. +                
  395. +                forEach(gameserverNode, "proxy", proxyNode -> {
  396. +                    final var proxySet = parseAttributes(proxyNode);
  397. +                    try
  398. +                    {
  399. +                        final var proxy = new L2Proxy(
  400. +                                serverId,
  401. +                                proxySet.getInteger("proxyServerId"),
  402. +                                proxySet.getString("proxyHost"),
  403. +                                proxySet.getInteger("proxyPort"),
  404. +                                hidesGameserver);
  405. +                        _proxyServers.put(proxySet.getInteger("proxyServerId"), proxy);
  406. +                    }
  407. +                    catch (UnknownHostException ex)
  408. +                    {
  409. +                        LOGGER.warn("Failed to process proxy due to badly formatted proxy host", ex);
  410. +                    }
  411. +                });                
  412. +            });
  413. +        });
  414. +    }
  415. +    
  416. +    public static L2ProxyData getInstance()
  417. +    {
  418. +        return L2ProxyData.SingletonHolder.INSTANCE;
  419. +    }
  420. +
  421. +    private static class SingletonHolder
  422. +    {
  423. +        protected static final L2ProxyData INSTANCE = new L2ProxyData();
  424. +    }
  425. +}
  426. \ No newline at end of file
  427. Index: java/net/sf/l2j/loginserver/model/L2Proxy.java
  428. ===================================================================
  429. --- java/net/sf/l2j/loginserver/model/L2Proxy.java  (nonexistent)
  430. +++ java/net/sf/l2j/loginserver/model/L2Proxy.java  (working copy)
  431. @@ -0,0 +1,47 @@
  432. +package net.sf.l2j.loginserver.model;
  433. +
  434. +import java.net.InetAddress;
  435. +import java.net.UnknownHostException;
  436. +
  437. +public class L2Proxy
  438. +{
  439. +    private final int _gameserverId;
  440. +    private final int _proxyServerId;
  441. +    private final InetAddress _proxyAddress;
  442. +    private final int _proxyPort;
  443. +    private final boolean _hidesGameserver;
  444. +
  445. +    public L2Proxy(int gameserverId, int proxyServerId, String proxyHost, int proxyPort, boolean hidesGameserver) throws UnknownHostException
  446. +    {
  447. +        _gameserverId = gameserverId;
  448. +        _proxyServerId = proxyServerId;
  449. +        _proxyAddress = InetAddress.getByName(proxyHost);
  450. +        _proxyPort = proxyPort;
  451. +        _hidesGameserver = hidesGameserver;
  452. +    }
  453. +
  454. +    public int getGameserverId()
  455. +    {
  456. +        return _gameserverId;
  457. +    }
  458. +
  459. +    public int getProxyServerId()
  460. +    {
  461. +        return _proxyServerId;
  462. +    }
  463. +
  464. +    public InetAddress getProxyAddress()
  465. +    {
  466. +        return _proxyAddress;
  467. +    }
  468. +    
  469. +    public int getProxyPort()
  470. +    {
  471. +        return _proxyPort;
  472. +    }
  473. +
  474. +    public boolean hidesGameserver()
  475. +    {
  476. +        return _hidesGameserver;
  477. +    }
  478. +}
  479. \ No newline at end of file
  480. Index: java/net/sf/l2j/loginserver/model/ServerData.java
  481. ===================================================================
  482. --- java/net/sf/l2j/loginserver/model/ServerData.java   (revision 9)
  483. +++ java/net/sf/l2j/loginserver/model/ServerData.java   (working copy)
  484. @@ -33,6 +33,21 @@
  485.         _isShowingClock = gsi.isShowingClock();
  486.     }
  487.    
  488. +   public ServerData(ServerType type, int serverId, String hostName, int port, GameServerInfo gsi)
  489. +   {
  490. +       _type = type;
  491. +       _hostName = hostName;
  492. +       _serverId = serverId;
  493. +       _port = port;
  494. +       _currentPlayers = gsi.getCurrentPlayerCount();
  495. +       _maxPlayers = gsi.getMaxPlayers();
  496. +       _ageLimit = gsi.getAgeLimit();
  497. +       _isPvp = gsi.isPvp();
  498. +       _isTestServer = gsi.isTestServer();
  499. +       _isShowingBrackets = gsi.isShowingBrackets();
  500. +       _isShowingClock = gsi.isShowingClock();
  501. +   }
  502. +  
  503.     public ServerType getType()
  504.     {
  505.         return _type;
  506. Index: java/net/sf/l2j/loginserver/GameServerThread.java
  507. ===================================================================
  508. --- java/net/sf/l2j/loginserver/GameServerThread.java   (revision 9)
  509. +++ java/net/sf/l2j/loginserver/GameServerThread.java   (working copy)
  510. @@ -249,14 +249,16 @@
  511.         {
  512.             final PlayerAuthRequest par = new PlayerAuthRequest(data);
  513.             final SessionKey key = LoginController.getInstance().getKeyForAccount(par.getAccount());
  514. +           var authedClient = LoginController.getInstance().getAuthedClient(par.getAccount());
  515. +           var ipAddress = authedClient != null ? authedClient.getConnection().getInetAddress().getHostAddress() : "";
  516.            
  517.             if (key != null && key.equals(par.getKey()))
  518.             {
  519.                 LoginController.getInstance().removeAuthedLoginClient(par.getAccount());
  520. -               sendPacket(new PlayerAuthResponse(par.getAccount(), true));
  521. +               sendPacket(new PlayerAuthResponse(par.getAccount(), true, ipAddress));
  522.             }
  523.             else
  524. -               sendPacket(new PlayerAuthResponse(par.getAccount(), false));
  525. +               sendPacket(new PlayerAuthResponse(par.getAccount(), false, ipAddress));
  526.         }
  527.         else
  528.             forceClose(LoginServerFail.NOT_AUTHED);
  529.  
Advertisement
Add Comment
Please, Sign In to add comment