package org.n3r.eql.dbfieldcryptor.proxy; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.n3r.eql.dbfieldcryptor.SensitiveCryptor; import org.n3r.eql.dbfieldcryptor.parser.SensitiveFieldsParser; import org.n3r.eql.util.O; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.sql.PreparedStatement; import java.sql.ResultSet; import static java.lang.reflect.Proxy.newProxyInstance; @Slf4j @AllArgsConstructor class PreparedStmtHandler implements InvocationHandler { private final PreparedStatement pstmt; private final SensitiveFieldsParser parser; private final SensitiveCryptor cryptor; @Override public Object invoke( Object proxy, Method method, Object[] args) throws Throwable { if (O.in(method.getName(), "setString", "setObject") && parser.inBindIndices((Integer) args[0])) { try { if (args[1] != null) args[1] = cryptor.encrypt(args[1].toString()); } catch (Exception e) { log.warn("Encrypt parameter #{}# error", args[1], e); } } Object result = method.invoke(pstmt, args); if (O.in(method.getName(), "executeQuery", "getResultSet") && parser.getSecureResultIndices().size() > 0) { result = new ResultSetHandler((ResultSet) result, parser, cryptor) .createResultSetProxy(); } return result; } public PreparedStatement createPreparedStatementProxy() { return (PreparedStatement) newProxyInstance(getClass().getClassLoader(), new Class<?>[]{PreparedStatement.class}, this); } }