Class Utils


  • public class Utils
    extends java.lang.Object
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      private static class  Utils.Parse  
    • 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.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • 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
    • Constructor Detail

      • Utils

        public Utils()
    • 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 options
        host - 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 escape
        noBackslashEscapes - 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 encrypt
        seed - the seed to use
        passwordCharacterEncoding - password character encoding
        Returns:
        a scrambled password
        Throws:
        java.security.NoSuchAlgorithmException - if SHA1 is not available on the platform we are using
        java.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 array
        length - 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 array
        from - index of first byte in original byte array which will be copied
        to - 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 string
        protocol - 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 sql
        protocol - 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
      • 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 options
        host - 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 combined

        String 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 size
        offset - offset of last byte array
        length - length of last byte array
        byteArr - 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 array
        offset - offset
        dataLength - byte length to write
        outputBuilder - 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 command
        parameters - sql parameter
        fileName - server file name
        Returns:
        true if correspond