Package org.mariadb.jdbc.internal.util
Class Utils
- java.lang.Object
-
- org.mariadb.jdbc.internal.util.Utils
-
public class Utils extends java.lang.Object
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
Utils.Parse
-
Field Summary
Fields Modifier and Type Field Description private static char[]
hexArray
private static java.util.regex.Pattern
IP_V4
private static java.util.regex.Pattern
IP_V6
private static java.util.regex.Pattern
IP_V6_COMPRESSED
private static SocketHandlerFunction
socketHandler
-
Constructor Summary
Constructors Constructor Description Utils()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static java.lang.String
byteArrayToHexString(byte[] bytes)
static byte[]
copyRange(byte[] orig, int from, int to)
Copies from original byte array to a new byte array.static byte[]
copyWithLength(byte[] orig, int length)
Copies the original byte array content to a new byte array.static java.net.Socket
createSocket(Options options, java.lang.String host)
Create socket accordingly to options.static byte[]
encryptPassword(java.lang.String password, byte[] seed, java.lang.String passwordCharacterEncoding)
Encrypts a password.static java.lang.String
escapeString(java.lang.String value, boolean noBackslashEscapes)
Escape String.private static java.lang.String
getHex(byte[] raw)
private static Protocol
getProxyLoggingIfNeeded(UrlParser urlParser, Protocol protocol)
static java.util.TimeZone
getTimeZone(java.lang.String id)
Get timezone from Id.static java.lang.String
hexdump(byte[]... bytes)
Hexdump.static java.lang.String
hexdump(int maxQuerySizeToLog, int offset, int length, byte[]... byteArr)
Hexdump.static java.lang.String
intToHexString(int value)
Convert int value to hexadecimal String.static boolean
isIPv4(java.lang.String ip)
static boolean
isIPv6(java.lang.String ip)
static java.lang.String
nativeSql(java.lang.String sql, Protocol protocol)
Escape sql String.static java.lang.String
parseSessionVariables(java.lang.String sessionVariable)
Parse the option "sessionVariable" to ensure having no injection.private static java.lang.String
replaceFunctionParameter(java.lang.String functionString, Protocol protocol)
Helper function to replace function parameters in escaped string.private static java.lang.String
resolveEscapes(java.lang.String escaped, Protocol protocol)
static Protocol
retrieveProxy(UrlParser urlParser, GlobalStateInfo globalInfo)
Retrieve protocol corresponding to the failover options.static java.net.Socket
standardSocket(Options options, java.lang.String host)
Use standard socket implementation.static int
transactionFromString(java.lang.String txIsolation)
Traduce a String value of transaction isolation to corresponding java value.static boolean
validateFileName(java.lang.String sql, ParameterHolder[] parameters, java.lang.String fileName)
Validate that file name correspond to send query.private static void
writeHex(byte[] bytes, int offset, int dataLength, java.lang.StringBuilder outputBuilder)
Write bytes/hexadecimal value of a byte array to a StringBuilder.
-
-
-
Field Detail
-
hexArray
private static final char[] hexArray
-
IP_V4
private static final java.util.regex.Pattern IP_V4
-
IP_V6
private static final java.util.regex.Pattern IP_V6
-
IP_V6_COMPRESSED
private static final java.util.regex.Pattern IP_V6_COMPRESSED
-
socketHandler
private static final SocketHandlerFunction socketHandler
-
-
Method Detail
-
standardSocket
public static java.net.Socket standardSocket(Options options, java.lang.String host) throws java.io.IOException
Use standard socket implementation.- Parameters:
options
- url optionshost
- host to connect- Returns:
- socket
- Throws:
java.io.IOException
- in case of error establishing socket.
-
escapeString
public static java.lang.String escapeString(java.lang.String value, boolean noBackslashEscapes)
Escape String.- Parameters:
value
- value to escapenoBackslashEscapes
- must backslash be escaped- Returns:
- escaped string.
-
encryptPassword
public static byte[] encryptPassword(java.lang.String password, byte[] seed, java.lang.String passwordCharacterEncoding) throws java.security.NoSuchAlgorithmException, java.io.UnsupportedEncodingException
Encrypts a password.protocol for authentication is like this: 1. Server sends a random array of bytes (the seed) 2. client makes a sha1 digest of the password 3. client hashes the output of 2 4. client digests the seed 5. client updates the digest with the output from 3 6. an xor of the output of 5 and 2 is sent to server 7. server does the same thing and verifies that the scrambled passwords match
- Parameters:
password
- the password to encryptseed
- the seed to usepasswordCharacterEncoding
- password character encoding- Returns:
- a scrambled password
- Throws:
java.security.NoSuchAlgorithmException
- if SHA1 is not available on the platform we are usingjava.io.UnsupportedEncodingException
- if passwordCharacterEncoding is not a valid charset name
-
copyWithLength
public static byte[] copyWithLength(byte[] orig, int length)
Copies the original byte array content to a new byte array. The resulting byte array is always "length" size. If length is smaller than the original byte array, the resulting byte array is truncated. If length is bigger than the original byte array, the resulting byte array is filled with zero bytes.- Parameters:
orig
- the original byte arraylength
- how big the resulting byte array will be- Returns:
- the copied byte array
-
copyRange
public static byte[] copyRange(byte[] orig, int from, int to)
Copies from original byte array to a new byte array. The resulting byte array is always "to-from" size.- Parameters:
orig
- the original byte arrayfrom
- index of first byte in original byte array which will be copiedto
- index of last byte in original byte array which will be copied. This can be outside of the original byte array- Returns:
- resulting array
-
replaceFunctionParameter
private static java.lang.String replaceFunctionParameter(java.lang.String functionString, Protocol protocol)
Helper function to replace function parameters in escaped string. 3 functions are handles :- CONVERT(value, type): replacing SQL_XXX types to convertible type, i.e SQL_BIGINT to INTEGER
- TIMESTAMPDIFF(type, ...): replacing type SQL_TSI_XXX in type with XXX, i.e SQL_TSI_HOUR with HOUR
- TIMESTAMPADD(type, ...): replacing type SQL_TSI_XXX in type with XXX, i.e SQL_TSI_HOUR with HOUR
caution: this use MariaDB server conversion: 'SELECT CONVERT('2147483648', INTEGER)' will return a BIGINT. MySQL will throw a syntax error.
- Parameters:
functionString
- input stringprotocol
- protocol- Returns:
- unescaped string
-
resolveEscapes
private static java.lang.String resolveEscapes(java.lang.String escaped, Protocol protocol) throws java.sql.SQLException
- Throws:
java.sql.SQLException
-
nativeSql
public static java.lang.String nativeSql(java.lang.String sql, Protocol protocol) throws java.sql.SQLException
Escape sql String.- Parameters:
sql
- initial sqlprotocol
- protocol- Returns:
- escaped sql string
- Throws:
java.sql.SQLException
- if escape sequence is incorrect.
-
retrieveProxy
public static Protocol retrieveProxy(UrlParser urlParser, GlobalStateInfo globalInfo) throws java.sql.SQLException
Retrieve protocol corresponding to the failover options. if no failover option, protocol will not be proxied. if a failover option is precised, protocol will be proxied so that any connection error will be handle directly.- Parameters:
urlParser
- urlParser corresponding to connection url string.globalInfo
- global variable information- Returns:
- protocol
- Throws:
java.sql.SQLException
- if any error occur during connection
-
getProxyLoggingIfNeeded
private static Protocol getProxyLoggingIfNeeded(UrlParser urlParser, Protocol protocol)
-
getTimeZone
public static java.util.TimeZone getTimeZone(java.lang.String id) throws java.sql.SQLException
Get timezone from Id. This differ from java implementation : by default, if timezone Id is unknown, java return GMT timezone. GMT will be return only if explicitly asked.- Parameters:
id
- timezone id- Returns:
- timezone.
- Throws:
java.sql.SQLException
- if no timezone is found for this Id
-
createSocket
public static java.net.Socket createSocket(Options options, java.lang.String host) throws java.io.IOException
Create socket accordingly to options.- Parameters:
options
- Url optionshost
- hostName ( mandatory only for named pipe)- Returns:
- a nex socket
- Throws:
java.io.IOException
- if connection error occur
-
hexdump
public static java.lang.String hexdump(byte[]... bytes)
Hexdump.- Parameters:
bytes
- byte arrays- Returns:
- String
-
hexdump
public static java.lang.String hexdump(int maxQuerySizeToLog, int offset, int length, byte[]... byteArr)
Hexdump. Multiple byte arrays will be combinedString output example :
+--------------------------------------------------+ | 0 1 2 3 4 5 6 7 8 9 a b c d e f | +--------------------------------------------------+------------------+ | 11 00 00 02 00 00 00 02 40 00 00 00 08 01 06 05 | ........@....... | | 74 65 73 74 6A | testj | +--------------------------------------------------+------------------+
- Parameters:
maxQuerySizeToLog
- max log sizeoffset
- offset of last byte arraylength
- length of last byte arraybyteArr
- byte arrays. if many, only the last may have offset and size limitation others will be displayed completely.- Returns:
- String
-
writeHex
private static void writeHex(byte[] bytes, int offset, int dataLength, java.lang.StringBuilder outputBuilder)
Write bytes/hexadecimal value of a byte array to a StringBuilder.String output example :
+--------------------------------------------------+ | 0 1 2 3 4 5 6 7 8 9 a b c d e f | +--------------------------------------------------+------------------+ | 5F 00 00 00 03 73 65 74 20 61 75 74 6F 63 6F 6D | _....set autocom | | 6D 69 74 3D 31 2C 20 73 65 73 73 69 6F 6E 5F 74 | mit=1, session_t | | 72 61 63 6B 5F 73 63 68 65 6D 61 3D 31 2C 20 73 | rack_schema=1, s | | 71 6C 5F 6D 6F 64 65 20 3D 20 63 6F 6E 63 61 74 | ql_mode = concat | | 28 40 40 73 71 6C 5F 6D 6F 64 65 2C 27 2C 53 54 | (@@sql_mode,',ST | | 52 49 43 54 5F 54 52 41 4E 53 5F 54 41 42 4C 45 | RICT_TRANS_TABLE | | 53 27 29 | S') | +--------------------------------------------------+------------------+
- Parameters:
bytes
- byte arrayoffset
- offsetdataLength
- byte length to writeoutputBuilder
- string builder
-
getHex
private static java.lang.String getHex(byte[] raw)
-
byteArrayToHexString
public static java.lang.String byteArrayToHexString(byte[] bytes)
-
intToHexString
public static java.lang.String intToHexString(int value)
Convert int value to hexadecimal String.- Parameters:
value
- value to transform- Returns:
- Hexadecimal String value of integer.
-
parseSessionVariables
public static java.lang.String parseSessionVariables(java.lang.String sessionVariable)
Parse the option "sessionVariable" to ensure having no injection. semi-column not in string will be replaced by comma.- Parameters:
sessionVariable
- option value- Returns:
- parsed String
-
isIPv4
public static boolean isIPv4(java.lang.String ip)
-
isIPv6
public static boolean isIPv6(java.lang.String ip)
-
transactionFromString
public static int transactionFromString(java.lang.String txIsolation) throws java.sql.SQLException
Traduce a String value of transaction isolation to corresponding java value.- Parameters:
txIsolation
- String value- Returns:
- java corresponding value (Connection.TRANSACTION_READ_UNCOMMITTED, Connection.TRANSACTION_READ_COMMITTED, Connection.TRANSACTION_REPEATABLE_READ or Connection.TRANSACTION_SERIALIZABLE)
- Throws:
java.sql.SQLException
- if String value doesn't correspond to @@tx_isolation/@@transaction_isolation possible value
-
validateFileName
public static boolean validateFileName(java.lang.String sql, ParameterHolder[] parameters, java.lang.String fileName)
Validate that file name correspond to send query.- Parameters:
sql
- sql commandparameters
- sql parameterfileName
- server file name- Returns:
- true if correspond
-
-