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.CallableStatement; import static java.lang.reflect.Proxy.newProxyInstance; @Slf4j @AllArgsConstructor class CallableStmtHandler implements InvocationHandler { private final CallableStatement stmt; 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]); } return method.invoke(stmt, args); } if (O.in(method.getName(), "getString", "getObject") && parser.inBindIndices((Integer) args[0])) { try { Object result = method.invoke(stmt, args); return result != null ? cryptor.decrypt("" + result) : result; } catch (Exception e) { log.warn("Decrypt parameter #{}# error", args[1]); } } return method.invoke(stmt, args); } public CallableStatement createCallableStatement() { return (CallableStatement) newProxyInstance(getClass().getClassLoader(), new Class<?>[]{CallableStatement.class}, this); } }