2016-12-24 05:55:17 +01:00
package net.ME1312.SubServers.Bungee.Network ;
2016-12-05 04:21:04 +01:00
2018-10-08 01:25:08 +02:00
import com.dosse.upnp.UPnP ;
2018-08-05 23:41:17 +02:00
import net.ME1312.SubServers.Bungee.Event.SubNetworkConnectEvent ;
import net.ME1312.SubServers.Bungee.Event.SubNetworkDisconnectEvent ;
2018-04-15 03:53:51 +02:00
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Library.Exception.IllegalPacketException ;
2018-07-29 20:39:42 +02:00
import net.ME1312.SubServers.Bungee.Library.NamedContainer ;
2017-01-30 21:22:36 +01:00
import net.ME1312.SubServers.Bungee.Library.Util ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Library.Version.Version ;
2018-01-05 23:30:01 +01:00
import net.ME1312.SubServers.Bungee.Network.Encryption.AES ;
2016-12-24 05:55:17 +01:00
import net.ME1312.SubServers.Bungee.Network.Packet.* ;
import net.ME1312.SubServers.Bungee.SubPlugin ;
2018-08-24 04:32:49 +02:00
import org.msgpack.value.Value ;
2016-12-05 04:21:04 +01:00
import java.io.IOException ;
2017-07-19 01:28:59 +02:00
import java.lang.reflect.InvocationTargetException ;
2016-12-15 22:04:39 +01:00
import java.net.* ;
2018-01-05 21:37:23 +01:00
import java.util.* ;
2017-12-07 18:22:36 +01:00
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
2016-12-05 04:21:04 +01:00
/ * *
2016-12-15 22:04:39 +01:00
* SubDataServer Class
2016-12-05 04:21:04 +01:00
* /
2016-12-15 22:04:39 +01:00
public final class SubDataServer {
2017-08-31 02:12:26 +02:00
private static int MAX_QUEUE = 64 ;
2018-07-29 20:39:42 +02:00
private static HashMap < Class < ? extends PacketOut > , NamedContainer < String , String > > pOut = new HashMap < Class < ? extends PacketOut > , NamedContainer < String , String > > ( ) ;
private static HashMap < String , HashMap < String , List < PacketIn > > > pIn = new HashMap < String , HashMap < String , List < PacketIn > > > ( ) ;
2018-01-05 21:37:23 +01:00
private static HashMap < String , Cipher > ciphers = new HashMap < String , Cipher > ( ) ;
2017-12-07 18:22:36 +01:00
private static List < String > allowedAddresses = new ArrayList < String > ( ) ;
2016-12-15 22:04:39 +01:00
private static boolean defaults = false ;
2017-07-19 01:28:59 +02:00
private HashMap < String , Client > clients = new HashMap < String , Client > ( ) ;
2016-12-05 04:21:04 +01:00
private ServerSocket server ;
2018-01-05 21:37:23 +01:00
private Cipher cipher ;
2017-01-21 17:49:37 +01:00
protected SubPlugin plugin ;
2019-04-19 17:46:39 +02:00
String password ;
2016-12-05 04:21:04 +01:00
/ * *
2016-12-15 22:04:39 +01:00
* SubData Server Instance
2016-12-05 04:21:04 +01:00
*
* @param plugin SubPlugin
* @param port Port
2017-07-19 01:28:59 +02:00
* @param address Bind
2018-01-05 21:37:23 +01:00
* @param cipher Cipher ( or null for none )
2016-12-05 04:21:04 +01:00
* @throws IOException
* /
2018-01-05 21:37:23 +01:00
public SubDataServer ( SubPlugin plugin , int port , InetAddress address , Cipher cipher ) throws IOException {
if ( Util . isNull ( plugin , port , MAX_QUEUE ) ) throw new NullPointerException ( ) ;
2017-04-03 19:08:00 +02:00
if ( address = = null ) {
2017-07-19 01:28:59 +02:00
server = new ServerSocket ( port , MAX_QUEUE ) ;
2017-12-07 18:22:36 +01:00
allowConnection ( " 127.0.0.1 " ) ;
2017-04-03 19:08:00 +02:00
} else {
2017-07-19 01:28:59 +02:00
server = new ServerSocket ( port , MAX_QUEUE , address ) ;
2017-12-07 18:22:36 +01:00
allowConnection ( address . getHostAddress ( ) ) ;
2017-04-03 19:08:00 +02:00
}
2018-10-08 01:25:08 +02:00
if ( UPnP . isUPnPAvailable ( ) & & plugin . config . get ( ) . getSection ( " Settings " ) . getSection ( " UPnP " , new YAMLSection ( ) ) . getBoolean ( " Forward-SubData " , false ) ) UPnP . openPortTCP ( port ) ;
2016-12-05 04:21:04 +01:00
this . plugin = plugin ;
2019-04-19 17:46:39 +02:00
this . password = plugin . config . get ( ) . getSection ( " Settings " ) . getSection ( " SubData " ) . getRawString ( " Password " ) ;
2018-01-05 21:37:23 +01:00
this . cipher = ( cipher ! = null ) ? cipher : new Cipher ( ) {
@Override
public String getName ( ) {
return " NONE " ;
}
@Override
2018-08-24 04:32:49 +02:00
public Value encrypt ( String key , YAMLSection data ) {
return data . msgPack ( ) ;
2018-01-05 21:37:23 +01:00
}
@Override
2018-04-15 03:53:51 +02:00
@SuppressWarnings ( " unchecked " )
2018-08-24 04:32:49 +02:00
public YAMLSection decrypt ( String key , Value data ) {
return new YAMLSection ( data . asMapValue ( ) ) ;
2018-01-05 21:37:23 +01:00
}
} ;
2016-12-05 04:21:04 +01:00
2016-12-15 22:04:39 +01:00
if ( ! defaults ) loadDefaults ( ) ;
2016-12-05 04:21:04 +01:00
}
2018-01-05 21:37:23 +01:00
static {
addCipher ( " AES " , new AES ( 128 ) ) ;
addCipher ( " AES_128 " , new AES ( 128 ) ) ;
addCipher ( " AES_192 " , new AES ( 192 ) ) ;
addCipher ( " AES_256 " , new AES ( 256 ) ) ;
} private void loadDefaults ( ) {
2016-12-15 22:04:39 +01:00
defaults = true ;
2016-12-05 04:21:04 +01:00
2016-12-19 01:38:02 +01:00
plugin . getPluginManager ( ) . registerListener ( null , new PacketOutRunEvent ( plugin ) ) ;
2018-07-29 20:39:42 +02:00
registerPacket ( new PacketAuthorization ( plugin ) , " SubData " , " Authorization " ) ;
registerPacket ( new PacketCommandServer ( plugin ) , " SubServers " , " CommandServer " ) ;
registerPacket ( new PacketCreateServer ( plugin ) , " SubServers " , " CreateServer " ) ;
2018-08-09 20:54:56 +02:00
registerPacket ( new PacketDownloadGroupInfo ( plugin ) , " SubServers " , " DownloadGroupInfo " ) ;
2018-07-29 20:39:42 +02:00
registerPacket ( new PacketDownloadHostInfo ( plugin ) , " SubServers " , " DownloadHostInfo " ) ;
registerPacket ( new PacketDownloadLang ( plugin ) , " SubServers " , " DownloadLang " ) ;
registerPacket ( new PacketDownloadNetworkList ( plugin ) , " SubServers " , " DownloadNetworkList " ) ;
2018-08-09 20:54:56 +02:00
registerPacket ( new PacketDownloadPlatformInfo ( plugin ) , " SubServers " , " DownloadPlatformInfo " ) ;
2018-07-29 20:39:42 +02:00
registerPacket ( new PacketDownloadPlayerList ( plugin ) , " SubServers " , " DownloadPlayerList " ) ;
registerPacket ( new PacketDownloadProxyInfo ( plugin ) , " SubServers " , " DownloadProxyInfo " ) ;
registerPacket ( new PacketDownloadServerInfo ( plugin ) , " SubServers " , " DownloadServerInfo " ) ;
registerPacket ( new PacketExAddServer ( ) , " SubServers " , " ExAddServer " ) ;
registerPacket ( new PacketExConfigureHost ( plugin ) , " SubServers " , " ExConfigureHost " ) ;
registerPacket ( new PacketExCreateServer ( null ) , " SubServers " , " ExCreateServer " ) ;
registerPacket ( new PacketExDeleteServer ( ) , " SubServers " , " ExDeleteServer " ) ;
registerPacket ( new PacketExRemoveServer ( ) , " SubServers " , " ExRemoveServer " ) ;
registerPacket ( new PacketExUpdateServer ( plugin ) , " SubServers " , " ExUpdateServer " ) ;
registerPacket ( new PacketInExLogMessage ( ) , " SubServers " , " ExLogMessage " ) ;
registerPacket ( new PacketInExRequestQueue ( plugin ) , " SubServers " , " ExRequestQueue " ) ;
registerPacket ( new PacketLinkExHost ( plugin ) , " SubServers " , " LinkExHost " ) ;
registerPacket ( new PacketLinkProxy ( plugin ) , " SubServers " , " LinkProxy " ) ;
registerPacket ( new PacketLinkServer ( plugin ) , " SubServers " , " LinkServer " ) ;
2019-01-20 23:49:12 +01:00
registerPacket ( new PacketRestartServer ( plugin ) , " SubServers " , " RestartServer " ) ;
2018-07-29 20:39:42 +02:00
registerPacket ( new PacketStartServer ( plugin ) , " SubServers " , " StartServer " ) ;
registerPacket ( new PacketStopServer ( plugin ) , " SubServers " , " StopServer " ) ;
registerPacket ( PacketAuthorization . class , " SubData " , " Authorization " ) ;
registerPacket ( PacketCommandServer . class , " SubServers " , " CommandServer " ) ;
registerPacket ( PacketCreateServer . class , " SubServers " , " CreateServer " ) ;
2018-08-09 20:54:56 +02:00
registerPacket ( PacketDownloadGroupInfo . class , " SubServers " , " DownloadGroupInfo " ) ;
2018-07-29 20:39:42 +02:00
registerPacket ( PacketDownloadHostInfo . class , " SubServers " , " DownloadHostInfo " ) ;
registerPacket ( PacketDownloadLang . class , " SubServers " , " DownloadLang " ) ;
registerPacket ( PacketDownloadNetworkList . class , " SubServers " , " DownloadNetworkList " ) ;
2018-08-09 20:54:56 +02:00
registerPacket ( PacketDownloadPlatformInfo . class , " SubServers " , " DownloadPlatformInfo " ) ;
2018-07-29 20:39:42 +02:00
registerPacket ( PacketDownloadPlayerList . class , " SubServers " , " DownloadPlayerList " ) ;
registerPacket ( PacketDownloadProxyInfo . class , " SubServers " , " DownloadProxyInfo " ) ;
registerPacket ( PacketDownloadServerInfo . class , " SubServers " , " DownloadServerInfo " ) ;
registerPacket ( PacketExAddServer . class , " SubServers " , " ExAddServer " ) ;
registerPacket ( PacketExConfigureHost . class , " SubServers " , " ExConfigureHost " ) ;
registerPacket ( PacketExCreateServer . class , " SubServers " , " ExCreateServer " ) ;
registerPacket ( PacketExDeleteServer . class , " SubServers " , " ExDeleteServer " ) ;
registerPacket ( PacketExRemoveServer . class , " SubServers " , " ExRemoveServer " ) ;
registerPacket ( PacketExUpdateServer . class , " SubServers " , " ExUpdateServer " ) ;
2019-01-10 21:52:38 +01:00
registerPacket ( PacketOutExUpdateWhitelist . class , " SubServers " , " ExUpdateWhitelist " ) ;
2018-07-29 20:39:42 +02:00
registerPacket ( PacketLinkExHost . class , " SubServers " , " LinkExHost " ) ;
registerPacket ( PacketLinkProxy . class , " SubServers " , " LinkProxy " ) ;
registerPacket ( PacketLinkServer . class , " SubServers " , " LinkServer " ) ;
registerPacket ( PacketOutRunEvent . class , " SubServers " , " RunEvent " ) ;
registerPacket ( PacketOutReload . class , " SubServers " , " Reload " ) ;
registerPacket ( PacketOutReset . class , " SubServers " , " Reset " ) ;
2019-01-20 23:49:12 +01:00
registerPacket ( PacketRestartServer . class , " SubServers " , " RestartServer " ) ;
2018-07-29 20:39:42 +02:00
registerPacket ( PacketStartServer . class , " SubServers " , " StartServer " ) ;
registerPacket ( PacketStopServer . class , " SubServers " , " StopServer " ) ;
2016-12-05 04:21:04 +01:00
}
/ * *
* Gets the Server Socket
*
* @return Server Socket
* /
public ServerSocket getServer ( ) {
return server ;
}
2017-06-30 15:36:16 +02:00
/ * *
2018-01-05 21:37:23 +01:00
* Add a Cipher for use by SubData
*
* @param cipher Cipher to Add
* @param handle Handle to Bind
* /
public static void addCipher ( String handle , Cipher cipher ) {
if ( Util . isNull ( cipher ) ) throw new NullPointerException ( ) ;
2018-01-12 22:56:22 +01:00
if ( ciphers . keySet ( ) . contains ( handle . toUpperCase ( ) . replace ( '-' , '_' ) . replace ( ' ' , '_' ) ) ) throw new IllegalStateException ( " Cipher already exists: " + handle ) ;
ciphers . put ( handle . toUpperCase ( ) . replace ( '-' , '_' ) . replace ( ' ' , '_' ) , cipher ) ;
2018-01-05 21:37:23 +01:00
}
/ * *
* Gets the Ciphers
*
* @return Cipher Map
* /
public static Map < String , Cipher > getCiphers ( ) {
return new TreeMap < > ( ciphers ) ;
}
/ * *
* Gets the Server ' s Cipher
*
* @return Cipher
* /
public Cipher getCipher ( ) {
return cipher ;
}
/ * *
* Gets a Cipher by Handle
2017-06-30 15:36:16 +02:00
*
2018-01-05 21:37:23 +01:00
* @param handle Handle
* @return Cipher
2017-06-30 15:36:16 +02:00
* /
2018-01-05 21:37:23 +01:00
public static Cipher getCipher ( String handle ) {
2018-01-12 22:56:22 +01:00
return getCiphers ( ) . get ( handle . toUpperCase ( ) . replace ( '-' , '_' ) . replace ( ' ' , '_' ) ) ;
2017-06-30 15:36:16 +02:00
}
2016-12-05 04:21:04 +01:00
/ * *
* Add a Client to the Network
*
* @param socket Client to add
* @throws IOException
* /
public Client addClient ( Socket socket ) throws IOException {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( socket ) ) throw new NullPointerException ( ) ;
2017-12-07 18:22:36 +01:00
if ( checkConnection ( socket . getInetAddress ( ) ) ) {
2017-01-09 20:37:57 +01:00
Client client = new Client ( this , socket ) ;
2016-12-05 04:21:04 +01:00
System . out . println ( " SubData > " + client . getAddress ( ) . toString ( ) + " has connected " ) ;
2017-07-19 01:28:59 +02:00
clients . put ( client . getAddress ( ) . toString ( ) , client ) ;
2016-12-05 04:21:04 +01:00
return client ;
} else {
2017-04-10 05:39:22 +02:00
System . out . println ( " SubData > " + socket . getInetAddress ( ) . toString ( ) + " attempted to connect, but isn't white-listed " ) ;
2016-12-05 04:21:04 +01:00
socket . close ( ) ;
return null ;
}
}
/ * *
* Grabs a Client from the Network
*
* @param socket Socket to search
* @return Client
* /
public Client getClient ( Socket socket ) {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( socket ) ) throw new NullPointerException ( ) ;
2018-08-05 23:41:17 +02:00
return getClient ( new InetSocketAddress ( socket . getInetAddress ( ) , socket . getPort ( ) ) ) ;
2016-12-05 04:21:04 +01:00
}
/ * *
* Grabs a Client from the Network
*
* @param address Address to search
* @return Client
* /
2016-12-15 22:04:39 +01:00
public Client getClient ( InetSocketAddress address ) {
2017-07-19 01:28:59 +02:00
if ( Util . isNull ( address ) ) throw new NullPointerException ( ) ;
2018-08-05 23:41:17 +02:00
return getClient ( address . toString ( ) ) ;
2017-07-19 01:28:59 +02:00
}
/ * *
* Grabs a Client from the Network
*
* @param address Address to search
* @return Client
* /
public Client getClient ( String address ) {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( address ) ) throw new NullPointerException ( ) ;
2016-12-05 04:21:04 +01:00
return clients . get ( address ) ;
}
2017-01-08 03:30:03 +01:00
/ * *
2017-06-30 15:36:16 +02:00
* Grabs all the Clients on the Network
2017-01-08 03:30:03 +01:00
*
* @return Client List
* /
public Collection < Client > getClients ( ) {
return clients . values ( ) ;
}
2016-12-05 04:21:04 +01:00
/ * *
* Remove a Client from the Network
*
* @param client Client to Kick
* @throws IOException
* /
public void removeClient ( Client client ) throws IOException {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( client ) ) throw new NullPointerException ( ) ;
2018-08-05 23:41:17 +02:00
removeClient ( client . getAddress ( ) ) ;
2016-12-05 04:21:04 +01:00
}
/ * *
* Remove a Client from the Network
*
* @param address Address to Kick
* @throws IOException
* /
2016-12-15 22:04:39 +01:00
public void removeClient ( InetSocketAddress address ) throws IOException {
2017-07-19 01:28:59 +02:00
if ( Util . isNull ( address ) ) throw new NullPointerException ( ) ;
2018-08-05 23:41:17 +02:00
removeClient ( address . toString ( ) ) ;
2017-07-19 01:28:59 +02:00
}
/ * *
* Remove a Client from the Network
*
* @param address Address to Kick
* @throws IOException
* /
public void removeClient ( String address ) throws IOException {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( address ) ) throw new NullPointerException ( ) ;
2016-12-05 04:21:04 +01:00
if ( clients . keySet ( ) . contains ( address ) ) {
2018-08-05 23:41:17 +02:00
Client client = clients . get ( address ) ;
plugin . getPluginManager ( ) . callEvent ( new SubNetworkDisconnectEvent ( this , client ) ) ;
2016-12-05 04:21:04 +01:00
clients . remove ( address ) ;
client . disconnect ( ) ;
System . out . println ( " SubData > " + client . getAddress ( ) . toString ( ) + " has disconnected " ) ;
}
}
/ * *
2016-12-15 22:04:39 +01:00
* Register PacketIn to the Network
2016-12-05 04:21:04 +01:00
*
* @param packet PacketIn to register
2018-07-29 20:39:42 +02:00
* @param channel Packet Channel
2016-12-05 04:21:04 +01:00
* @param handle Handle to Bind
* /
2018-07-29 20:39:42 +02:00
public static void registerPacket ( PacketIn packet , String channel , String handle ) {
2018-07-30 01:01:36 +02:00
if ( Util . isNull ( packet , channel , handle ) ) throw new NullPointerException ( ) ;
2018-07-29 20:39:42 +02:00
HashMap < String , List < PacketIn > > map = ( pIn . keySet ( ) . contains ( channel . toLowerCase ( ) ) ) ? pIn . get ( channel . toLowerCase ( ) ) : new HashMap < String , List < PacketIn > > ( ) ;
List < PacketIn > list = ( map . keySet ( ) . contains ( handle ) ) ? map . get ( handle ) : new ArrayList < PacketIn > ( ) ;
2017-06-30 15:36:16 +02:00
if ( ! list . contains ( packet ) ) {
list . add ( packet ) ;
2018-07-29 20:39:42 +02:00
map . put ( handle , list ) ;
pIn . put ( channel . toLowerCase ( ) , map ) ;
2017-06-30 15:36:16 +02:00
}
2016-12-05 04:21:04 +01:00
}
2017-01-08 03:30:03 +01:00
/ * *
* Unregister PacketIn from the Network
*
2018-07-29 20:39:42 +02:00
* @param channel Packet Channel
2017-01-08 03:30:03 +01:00
* @param packet PacketIn to unregister
* /
2018-07-29 20:39:42 +02:00
public static void unregisterPacket ( String channel , PacketIn packet ) {
2018-07-30 01:01:36 +02:00
if ( Util . isNull ( channel , packet ) ) throw new NullPointerException ( ) ;
2018-07-29 20:39:42 +02:00
if ( pIn . keySet ( ) . contains ( channel . toLowerCase ( ) ) ) {
List < String > search = new ArrayList < String > ( ) ;
search . addAll ( pIn . get ( channel . toLowerCase ( ) ) . keySet ( ) ) ;
for ( String handle : search ) if ( pIn . get ( channel . toLowerCase ( ) ) . get ( handle ) . contains ( packet ) ) {
List < PacketIn > list = pIn . get ( channel . toLowerCase ( ) ) . get ( handle ) ;
list . remove ( packet ) ;
if ( list . isEmpty ( ) ) {
pIn . get ( channel . toLowerCase ( ) ) . remove ( handle ) ;
if ( pIn . get ( channel . toLowerCase ( ) ) . isEmpty ( ) ) pIn . remove ( channel . toLowerCase ( ) ) ;
} else {
pIn . get ( channel . toLowerCase ( ) ) . put ( handle , list ) ;
}
2017-06-30 15:36:16 +02:00
}
}
2017-01-08 03:30:03 +01:00
}
2016-12-05 04:21:04 +01:00
/ * *
2016-12-15 22:04:39 +01:00
* Register PacketOut to the Network
2016-12-05 04:21:04 +01:00
*
* @param packet PacketOut to register
2018-07-29 20:39:42 +02:00
* @param channel Packet Channel
2016-12-05 04:21:04 +01:00
* @param handle Handle to bind
* /
2018-07-29 20:39:42 +02:00
public static void registerPacket ( Class < ? extends PacketOut > packet , String channel , String handle ) {
2018-07-30 01:01:36 +02:00
if ( Util . isNull ( packet , channel , handle ) ) throw new NullPointerException ( ) ;
2018-07-29 20:39:42 +02:00
pOut . put ( packet , new NamedContainer < String , String > ( channel . toLowerCase ( ) , handle ) ) ;
2016-12-15 22:04:39 +01:00
}
2017-01-08 03:30:03 +01:00
/ * *
* Unregister PacketOut to the Network
*
2018-07-29 20:39:42 +02:00
* @param channel Packet Channel
2017-01-08 03:30:03 +01:00
* @param packet PacketOut to unregister
* /
2018-07-29 20:39:42 +02:00
public static void unregisterPacket ( String channel , Class < ? extends PacketOut > packet ) {
2018-07-30 01:01:36 +02:00
if ( Util . isNull ( channel , packet ) ) throw new NullPointerException ( ) ;
2018-07-29 20:39:42 +02:00
if ( pOut . keySet ( ) . contains ( packet ) & & pOut . get ( packet ) . name ( ) . equalsIgnoreCase ( channel ) ) pOut . remove ( packet ) ;
2017-01-08 03:30:03 +01:00
}
2016-12-15 22:04:39 +01:00
/ * *
2017-01-06 21:44:34 +01:00
* Grab PacketIn Instances via handle
2016-12-15 22:04:39 +01:00
*
2018-07-29 20:39:42 +02:00
* @param channel Packet Channel
2016-12-15 22:04:39 +01:00
* @param handle Handle
* @return PacketIn
* /
2018-07-29 20:39:42 +02:00
public static List < ? extends PacketIn > getPacket ( String channel , String handle ) {
2018-07-30 01:01:36 +02:00
if ( Util . isNull ( channel , handle ) ) throw new NullPointerException ( ) ;
2018-07-29 20:39:42 +02:00
return new ArrayList < PacketIn > ( pIn . get ( channel . toLowerCase ( ) ) . get ( handle ) ) ;
2016-12-05 04:21:04 +01:00
}
/ * *
2017-01-06 21:44:34 +01:00
* Broadcast a Packet to everything on the Network < br >
2016-12-05 04:21:04 +01:00
* < b > Warning : < / b > There are usually different types of applications on the network at once , they may not recognise the same packet handles
*
* @param packet Packet to send
* /
public void broadcastPacket ( PacketOut packet ) {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( packet ) ) throw new NullPointerException ( ) ;
2017-08-07 21:51:11 +02:00
List < Client > clients = new ArrayList < Client > ( ) ;
clients . addAll ( getClients ( ) ) ;
for ( Client client : clients ) {
2016-12-05 04:21:04 +01:00
client . sendPacket ( packet ) ;
}
}
/ * *
* Allow Connections from an Address
*
* @param address Address to allow
* /
2017-12-07 18:22:36 +01:00
public static void allowConnection ( String address ) {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( address ) ) throw new NullPointerException ( ) ;
2016-12-05 04:21:04 +01:00
if ( ! allowedAddresses . contains ( address ) ) allowedAddresses . add ( address ) ;
}
2017-12-07 18:22:36 +01:00
private boolean checkConnection ( InetAddress address ) {
boolean whitelisted = false ;
Matcher regaddress = Pattern . compile ( " ^( \\ d{1,3}).( \\ d{1,3}).( \\ d{1,3}).( \\ d{1,3})$ " ) . matcher ( address . getHostAddress ( ) ) ;
if ( regaddress . find ( ) ) {
for ( String allowed : allowedAddresses ) if ( ! whitelisted ) {
Matcher regallowed = Pattern . compile ( " ^( \\ d{1,3}|%).( \\ d{1,3}|%).( \\ d{1,3}|%).( \\ d{1,3}|%)$ " ) . matcher ( allowed ) ;
if ( regallowed . find ( ) & & (
( regaddress . group ( 1 ) . equals ( regallowed . group ( 1 ) ) | | regallowed . group ( 1 ) . equals ( " % " ) ) & &
( regaddress . group ( 2 ) . equals ( regallowed . group ( 2 ) ) | | regallowed . group ( 2 ) . equals ( " % " ) ) & &
( regaddress . group ( 3 ) . equals ( regallowed . group ( 3 ) ) | | regallowed . group ( 3 ) . equals ( " % " ) ) & &
( regaddress . group ( 4 ) . equals ( regallowed . group ( 4 ) ) | | regallowed . group ( 4 ) . equals ( " % " ) )
) ) whitelisted = true ;
}
}
2018-08-05 23:41:17 +02:00
SubNetworkConnectEvent event = new SubNetworkConnectEvent ( this , address ) ;
event . setCancelled ( ! whitelisted ) ;
plugin . getPluginManager ( ) . callEvent ( event ) ;
return ! event . isCancelled ( ) ;
2017-12-07 18:22:36 +01:00
}
2016-12-05 04:21:04 +01:00
/ * *
* Deny Connections from an Address
*
* @param address Address to deny
* /
2017-12-07 18:22:36 +01:00
public static void denyConnection ( String address ) {
2017-01-30 21:22:36 +01:00
if ( Util . isNull ( address ) ) throw new NullPointerException ( ) ;
2016-12-05 04:21:04 +01:00
allowedAddresses . remove ( address ) ;
}
/ * *
2018-04-15 03:53:51 +02:00
* Encode PacketOut
2016-12-05 04:21:04 +01:00
*
* @param packet PacketOut
* @return JSON Formatted Packet
* @throws IllegalPacketException
* /
2018-04-15 03:53:51 +02:00
protected static YAMLSection encodePacket ( Client client , PacketOut packet ) throws IllegalPacketException , InvocationTargetException {
YAMLSection section = new YAMLSection ( ) ;
2016-12-05 04:21:04 +01:00
2017-07-19 01:28:59 +02:00
if ( ! pOut . keySet ( ) . contains ( packet . getClass ( ) ) ) throw new IllegalPacketException ( packet . getClass ( ) . getCanonicalName ( ) + " : Unknown PacketOut Channel: " + packet . getClass ( ) . getCanonicalName ( ) ) ;
2019-01-22 18:48:47 +01:00
if ( packet . getVersion ( ) = = null ) throw new NullPointerException ( packet . getClass ( ) . getCanonicalName ( ) + " : PacketOut getVersion() cannot be null: " + packet . getClass ( ) . getCanonicalName ( ) ) ;
2017-07-19 01:28:59 +02:00
try {
2018-04-15 03:53:51 +02:00
YAMLSection contents = packet . generate ( ) ;
2018-07-29 20:39:42 +02:00
section . set ( " n " , pOut . get ( packet . getClass ( ) ) . name ( ) ) ;
section . set ( " h " , pOut . get ( packet . getClass ( ) ) . get ( ) ) ;
2019-01-22 18:48:47 +01:00
section . set ( " v " , packet . getVersion ( ) ) ;
2018-04-15 03:53:51 +02:00
if ( contents ! = null ) section . set ( " c " , contents ) ;
return section ;
2017-07-19 01:28:59 +02:00
} catch ( Throwable e ) {
throw new InvocationTargetException ( e , packet . getClass ( ) . getCanonicalName ( ) + " : Exception while encoding packet " ) ;
}
2016-12-05 04:21:04 +01:00
}
/ * *
2018-04-15 03:53:51 +02:00
* Decode PacketIn
2016-12-05 04:21:04 +01:00
*
2018-04-15 03:53:51 +02:00
* @param data Data to Decode
2016-12-05 04:21:04 +01:00
* @return PacketIn
* @throws IllegalPacketException
* /
2018-04-15 03:53:51 +02:00
protected static List < PacketIn > decodePacket ( Client client , YAMLSection data ) throws IllegalPacketException {
2018-07-29 20:39:42 +02:00
if ( ! data . contains ( " n " ) | | ! data . contains ( " h " ) | | ! data . contains ( " v " ) ) throw new IllegalPacketException ( client . getAddress ( ) . toString ( ) + " : Unknown Packet Format: " + data . toString ( ) ) ;
if ( ! pIn . keySet ( ) . contains ( data . getRawString ( " n " ) ) | | ! pIn . get ( data . getRawString ( " n " ) ) . keySet ( ) . contains ( data . getRawString ( " h " ) ) ) throw new IllegalPacketException ( " Unknown PacketIn Channel: " + data . getRawString ( " n " ) + ':' + data . getRawString ( " h " ) ) ;
2016-12-05 04:21:04 +01:00
2017-01-06 21:44:34 +01:00
List < PacketIn > list = new ArrayList < PacketIn > ( ) ;
2018-07-29 20:39:42 +02:00
for ( PacketIn packet : pIn . get ( data . getRawString ( " n " ) ) . get ( data . getRawString ( " h " ) ) ) {
2019-01-17 18:44:47 +01:00
if ( packet . isCompatible ( data . getVersion ( " v " ) ) ) {
2017-01-06 21:44:34 +01:00
list . add ( packet ) ;
} else {
2019-01-22 18:48:47 +01:00
new IllegalPacketException ( client . getAddress ( ) . toString ( ) + " : Packet Version Mismatch in " + data . getRawString ( " h " ) + " : " + data . getRawString ( " v " ) + " =/= " + packet . getVersion ( ) . toFullString ( ) ) . printStackTrace ( ) ;
2017-01-06 21:44:34 +01:00
}
}
return list ;
2016-12-05 04:21:04 +01:00
}
/ * *
* Drops All Connections and Stops the SubData Listener
*
* @throws IOException
* /
public void destroy ( ) throws IOException {
while ( clients . size ( ) > 0 ) {
removeClient ( ( Client ) clients . values ( ) . toArray ( ) [ 0 ] ) ;
}
server . close ( ) ;
2018-10-08 01:25:08 +02:00
if ( UPnP . isUPnPAvailable ( ) & & UPnP . isMappedTCP ( server . getLocalPort ( ) ) ) UPnP . closePortTCP ( server . getLocalPort ( ) ) ;
2016-12-05 04:21:04 +01:00
System . out . println ( " SubServers > The SubData Listener has been closed " ) ;
plugin . subdata = null ;
}
}