AuraDevelopmentTeam / InvSync

This plugin synchronizes the player inventory with a database
GNU General Public License v3.0
12 stars 10 forks source link

Passwords with @ in them break the MySQL JDBC URL #42

Closed BrainStone closed 5 years ago

BrainStone commented 5 years ago

Issue Description:

When a MySQL password contains the @ character it messes up the JDBC URL.

What happens:

The connection cannot be established, as now the hostname gets a prefix of sorts.

What you expected to happen:

That the password gets escaped properly

Steps to reproduce:

  1. Set MySQL password to contain @
  2. Configure MySQL storage options
  3. Start server
  4. Watch it fail

Affected Versions (Do not use "latest"):

Your most recent log or stack trace file where the issue was present:

[21:47:34] [Server thread/ERROR] [com.zaxxer.hikari.pool.HikariPool]: HikariPool-2 - Exception during pool initialization.
java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=WSX@1.2.3.4)(port=3306)(type=master) : WSX@1.2.3.4
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:156) ~[ExceptionMapper.class:1.12.2-2825-7.1.6]
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:118) ~[ExceptionMapper.class:1.12.2-2825-7.1.6]
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.throwException(ExceptionMapper.java:92) ~[ExceptionMapper.class:1.12.2-2825-7.1.6]
    at org.mariadb.jdbc.Driver.connect(Driver.java:111) ~[Driver.class:1.12.2-2825-7.1.6]
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:112) ~[DriverDataSource.class:1.12.2-2825-7.1.6]
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:118) ~[DriverDataSource.class:1.12.2-2825-7.1.6]
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[PoolBase.class:1.12.2-2825-7.1.6]
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) ~[PoolBase.class:1.12.2-2825-7.1.6]
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:443) [HikariPool.class:1.12.2-2825-7.1.6]
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:514) [HikariPool.class:1.12.2-2825-7.1.6]
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:111) [HikariPool.class:1.12.2-2825-7.1.6]
    at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:72) [HikariDataSource.class:1.12.2-2825-7.1.6]
    at org.spongepowered.common.service.sql.SqlServiceImpl$1.load(SqlServiceImpl.java:138) [SqlServiceImpl$1.class:1.12.2-2825-7.1.6]
    at org.spongepowered.common.service.sql.SqlServiceImpl$1.load(SqlServiceImpl.java:123) [SqlServiceImpl$1.class:1.12.2-2825-7.1.6]
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3716) [minecraft_server.1.12.2.jar:?]
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2424) [minecraft_server.1.12.2.jar:?]
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2298) [minecraft_server.1.12.2.jar:?]
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2211) [minecraft_server.1.12.2.jar:?]
    at com.google.common.cache.LocalCache.get(LocalCache.java:4154) [minecraft_server.1.12.2.jar:?]
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4158) [minecraft_server.1.12.2.jar:?]
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5147) [minecraft_server.1.12.2.jar:?]
    at org.spongepowered.common.service.sql.SqlServiceImpl.getDataSource(SqlServiceImpl.java:163) [SqlServiceImpl.class:1.12.2-2825-7.1.6]
    at org.spongepowered.common.service.sql.SqlServiceImpl.getDataSource(SqlServiceImpl.java:144) [SqlServiceImpl.class:1.12.2-2825-7.1.6]
    at world.jnc.invsync.util.database.DatabaseConnection.getDataSource(DatabaseConnection.java:28) [DatabaseConnection.class:0.6.19.298-DEV]
    at world.jnc.invsync.util.database.DatabaseConnection.getDataSource(DatabaseConnection.java:46) [DatabaseConnection.class:0.6.19.298-DEV]
    at world.jnc.invsync.util.database.DatabaseConnection.connect(DatabaseConnection.java:42) [DatabaseConnection.class:0.6.19.298-DEV]
    at world.jnc.invsync.util.database.DatabaseConnection.<init>(DatabaseConnection.java:34) [DatabaseConnection.class:0.6.19.298-DEV]
    at world.jnc.invsync.util.database.MysqlDatabaseConnection.<init>(MysqlDatabaseConnection.java:17) [MysqlDatabaseConnection.class:0.6.19.298-DEV]
    at world.jnc.invsync.util.database.DataSource.<init>(DataSource.java:56) [DataSource.class:0.6.19.298-DEV]
    at world.jnc.invsync.InventorySync.init(InventorySync.java:135) [InventorySync.class:0.6.19.298-DEV]
    at org.spongepowered.common.event.listener.GameInitializationEventListener_InventorySync_init82.handle(Unknown Source) [?:?]
    at org.spongepowered.common.event.RegisteredListener.handle(RegisteredListener.java:95) [RegisteredListener.class:1.12.2-2825-7.1.6]
    at org.spongepowered.mod.event.SpongeModEventManager.post(SpongeModEventManager.java:385) [SpongeModEventManager.class:1.12.2-2825-7.1.6]
    at org.spongepowered.mod.event.SpongeModEventManager.extendedPost(SpongeModEventManager.java:458) [SpongeModEventManager.class:1.12.2-2825-7.1.6]
    at org.spongepowered.mod.event.SpongeModEventManager.post(SpongeModEventManager.java:419) [SpongeModEventManager.class:1.12.2-2825-7.1.6]
    at org.spongepowered.common.SpongeImpl.postEvent(SpongeImpl.java:252) [SpongeImpl.class:1.12.2-2825-7.1.6]
    at org.spongepowered.mod.SpongeMod.onStateEvent(SpongeMod.java:339) [SpongeMod.class:1.12.2-2825-7.1.6]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_211]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_211]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_211]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_211]
    at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91) [minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150) [minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76) [minecraft_server.1.12.2.jar:?]
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399) [minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71) [minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116) [minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:217) [minecraft_server.1.12.2.jar:?]
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:219) [LoadController.class:?]
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:197) [LoadController.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_211]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_211]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_211]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_211]
    at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91) [minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150) [minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76) [minecraft_server.1.12.2.jar:?]
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399) [minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71) [minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116) [minecraft_server.1.12.2.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:217) [minecraft_server.1.12.2.jar:?]
    at net.minecraftforge.fml.common.LoadController.redirect$onPost$zza000(LoadController.java:553) [LoadController.class:?]
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:136) [LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.initializeMods(Loader.java:744) [Loader.class:?]
    at net.minecraftforge.fml.server.FMLServerHandler.finishServerLoading(FMLServerHandler.java:108) [FMLServerHandler.class:?]
    at net.minecraftforge.fml.common.FMLCommonHandler.onServerStarted(FMLCommonHandler.java:338) [FMLCommonHandler.class:?]
    at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:219) [nz.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486) [MinecraftServer.class:?]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_211]
Caused by: java.sql.SQLException: Could not connect to address=(host=WSX@1.2.3.4)(port=3306)(type=master) : WSX@1.2.3.4
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1036) ~[AbstractConnectProtocol.class:1.12.2-2825-7.1.6]
    at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:483) ~[Utils.class:1.12.2-2825-7.1.6]
    at org.mariadb.jdbc.Driver.connect(Driver.java:106) ~[Driver.class:1.12.2-2825-7.1.6]
    ... 65 more
Caused by: java.net.UnknownHostException: WSX@1.2.3.4
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[?:1.8.0_211]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:1.8.0_211]
    at java.net.Socket.connect(Socket.java:589) ~[?:1.8.0_211]
    at java.net.Socket.connect(Socket.java:538) ~[?:1.8.0_211]
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:401) ~[AbstractConnectProtocol.class:1.12.2-2825-7.1.6]
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1029) ~[AbstractConnectProtocol.class:1.12.2-2825-7.1.6]
    at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:483) ~[Utils.class:1.12.2-2825-7.1.6]
    at org.mariadb.jdbc.Driver.connect(Driver.java:106) ~[Driver.class:1.12.2-2825-7.1.6]
    ... 65 more
BrainStone commented 5 years ago

After the URL encoding was added, it was a Sponge bug: SpongePowered/SpongeCommon#2308

(So external and internal bug funnily enough)