* [ adempiere-Bugs-1719617 ] Server bean allows remote unauthenticated queries

- Added security token validation for wan profile. This is on by default, if you need to test the wan profile from your IDE ( Eclipse , Netbean, etc ), you need to manually edit the Adempiere.properties file on the application server, and change ServerValidateSecurityToken=xyzY to ServerValidateSecurityToken=xyzN
- Next step is to add JAAS authentication, later ...
This commit is contained in:
Heng Sin Low 2007-05-21 04:59:54 +00:00
parent 30f7ea07a6
commit 3d4f4cee2e
12 changed files with 104 additions and 21 deletions

View File

@ -19,6 +19,8 @@ package org.compiere;
import java.awt.*; import java.awt.*;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import java.security.CodeSource;
import java.security.cert.Certificate;
import java.util.logging.*; import java.util.logging.*;
import javax.jnlp.*; import javax.jnlp.*;
import javax.swing.*; import javax.swing.*;
@ -539,6 +541,25 @@ public final class Adempiere
} // startupEnvironment } // startupEnvironment
/**
* @return SecurityToken
*/
public static SecurityToken getSecurityToken()
{
Certificate cert = null;
String host = null;
CodeSource cs
= Adempiere.class.getProtectionDomain().getCodeSource();
if (cs != null)
{
Certificate[] certs = cs.getCertificates();
if (certs != null && certs.length > 0)
cert = certs[0];
}
host = Adempiere.getCodeBaseHost();
return new SecurityToken(cert, host);
}
/** /**
* Main Method * Main Method
* *

View File

@ -36,21 +36,21 @@ public interface Server
* @param info Result info * @param info Result info
* @return RowSet * @return RowSet
* @throws NotSerializableException */ * @throws NotSerializableException */
public javax.sql.RowSet pstmt_getRowSet( org.compiere.util.CStatementVO info ) public javax.sql.RowSet pstmt_getRowSet( org.compiere.util.CStatementVO info,org.compiere.util.SecurityToken token )
throws java.io.NotSerializableException, java.rmi.RemoteException; throws java.io.NotSerializableException, java.rmi.RemoteException;
/** /**
* Get Statement ResultSet * Get Statement ResultSet
* @param info Result info * @param info Result info
* @return RowSet */ * @return RowSet */
public javax.sql.RowSet stmt_getRowSet( org.compiere.util.CStatementVO info ) public javax.sql.RowSet stmt_getRowSet( org.compiere.util.CStatementVO info,org.compiere.util.SecurityToken token )
throws java.rmi.RemoteException; throws java.rmi.RemoteException;
/** /**
* Execute Update * Execute Update
* @param info Result info * @param info Result info
* @return row count */ * @return row count */
public int stmt_executeUpdate( org.compiere.util.CStatementVO info ) public int stmt_executeUpdate( org.compiere.util.CStatementVO info,org.compiere.util.SecurityToken token )
throws java.rmi.RemoteException; throws java.rmi.RemoteException;
/** /**
@ -150,7 +150,7 @@ public interface Server
* @param displayType display type (i.e. BLOB/CLOB) * @param displayType display type (i.e. BLOB/CLOB)
* @param value the data * @param value the data
* @return true if updated */ * @return true if updated */
public boolean updateLOB( java.lang.String sql,int displayType,java.lang.Object value ) public boolean updateLOB( java.lang.String sql,int displayType,java.lang.Object value,org.compiere.util.SecurityToken token )
throws java.rmi.RemoteException; throws java.rmi.RemoteException;
/** /**
@ -179,7 +179,7 @@ public interface Server
* @param procedureName * @param procedureName
* @param trxName * @param trxName
* @return ProcessInfo */ * @return ProcessInfo */
public org.compiere.process.ProcessInfo dbProcess( org.compiere.process.ProcessInfo processInfo,java.lang.String procedureName,java.lang.String trxName ) public org.compiere.process.ProcessInfo dbProcess( org.compiere.process.ProcessInfo processInfo,java.lang.String procedureName,java.lang.String trxName,org.compiere.util.SecurityToken token )
throws java.rmi.RemoteException; throws java.rmi.RemoteException;
/** /**

View File

@ -34,19 +34,19 @@ public interface ServerLocal
* @param info Result info * @param info Result info
* @return RowSet * @return RowSet
* @throws NotSerializableException */ * @throws NotSerializableException */
public javax.sql.RowSet pstmt_getRowSet( org.compiere.util.CStatementVO info ) throws java.io.NotSerializableException; public javax.sql.RowSet pstmt_getRowSet( org.compiere.util.CStatementVO info,org.compiere.util.SecurityToken token ) throws java.io.NotSerializableException;
/** /**
* Get Statement ResultSet * Get Statement ResultSet
* @param info Result info * @param info Result info
* @return RowSet */ * @return RowSet */
public javax.sql.RowSet stmt_getRowSet( org.compiere.util.CStatementVO info ) ; public javax.sql.RowSet stmt_getRowSet( org.compiere.util.CStatementVO info,org.compiere.util.SecurityToken token ) ;
/** /**
* Execute Update * Execute Update
* @param info Result info * @param info Result info
* @return row count */ * @return row count */
public int stmt_executeUpdate( org.compiere.util.CStatementVO info ) ; public int stmt_executeUpdate( org.compiere.util.CStatementVO info,org.compiere.util.SecurityToken token ) ;
/** /**
* Get next number for Key column = 0 is Error. * Get next number for Key column = 0 is Error.
@ -135,7 +135,7 @@ public interface ServerLocal
* @param displayType display type (i.e. BLOB/CLOB) * @param displayType display type (i.e. BLOB/CLOB)
* @param value the data * @param value the data
* @return true if updated */ * @return true if updated */
public boolean updateLOB( java.lang.String sql,int displayType,java.lang.Object value ) ; public boolean updateLOB( java.lang.String sql,int displayType,java.lang.Object value,org.compiere.util.SecurityToken token ) ;
/** /**
* Describes the instance and its content for debugging purpose * Describes the instance and its content for debugging purpose
@ -160,7 +160,7 @@ public interface ServerLocal
* @param procedureName * @param procedureName
* @param trxName * @param trxName
* @return ProcessInfo */ * @return ProcessInfo */
public org.compiere.process.ProcessInfo dbProcess( org.compiere.process.ProcessInfo processInfo,java.lang.String procedureName,java.lang.String trxName ) ; public org.compiere.process.ProcessInfo dbProcess( org.compiere.process.ProcessInfo processInfo,java.lang.String procedureName,java.lang.String trxName,org.compiere.util.SecurityToken token ) ;
/** /**
* Load fields meta data from database * Load fields meta data from database

View File

@ -675,7 +675,7 @@ public class MTable extends X_AD_Table
rs.close(); rs.close();
pstmt.close(); pstmt.close();
} }
catch (SQLException e) catch (Exception e)
{ {
retValue = -1; retValue = -1;
} }

View File

@ -20,6 +20,8 @@ import java.io.*;
import java.rmi.*; import java.rmi.*;
import java.sql.*; import java.sql.*;
import java.util.logging.*; import java.util.logging.*;
import org.compiere.Adempiere;
import org.compiere.db.*; import org.compiere.db.*;
import org.compiere.interfaces.*; import org.compiere.interfaces.*;
import org.compiere.util.*; import org.compiere.util.*;
@ -117,7 +119,7 @@ public class PO_LOB implements Serializable
{ {
if (server != null) if (server != null)
{ // See ServerBean { // See ServerBean
success = server.updateLOB (sql.toString(), m_displayType, m_value); success = server.updateLOB (sql.toString(), m_displayType, m_value, Adempiere.getSecurityToken());
if (CLogMgt.isLevelFinest()) if (CLogMgt.isLevelFinest())
log.fine("server => " + success); log.fine("server => " + success);
if (success) if (success)

View File

@ -197,8 +197,16 @@ public class CLogErrorBuffer extends Handler
) )
{ {
m_issueError = false; m_issueError = false;
MIssue.create(record); try
m_issueError = true; {
MIssue.create(record);
m_issueError = true;
} catch (Throwable e)
{
//failed to save exception to db, print to console
System.err.println(getFormatter().format(record));
m_issueError = false;
}
} }
else else
{ {

View File

@ -221,6 +221,21 @@ public class CLogger extends Logger implements Serializable
s_lastInfo = null; s_lastInfo = null;
} // resetLast } // resetLast
/**
* Get root cause
* @param t
* @return Throwable
*/
public static Throwable getRootCause(Throwable t)
{
Throwable cause = t;
while (cause.getCause() != null)
{
cause = cause.getCause();
}
return cause;
}
/** /**
* String Representation * String Representation
* @return info * @return info

View File

@ -23,6 +23,8 @@ import java.sql.*;
import java.util.*; import java.util.*;
import java.util.logging.*; import java.util.logging.*;
import javax.sql.*; import javax.sql.*;
import org.compiere.Adempiere;
import org.compiere.db.*; import org.compiere.db.*;
import org.compiere.interfaces.*; import org.compiere.interfaces.*;
@ -122,7 +124,7 @@ public class CPreparedStatement extends CStatement implements PreparedStatement
Server server = CConnection.get().getServer(); Server server = CConnection.get().getServer();
if (server != null) if (server != null)
{ {
ResultSet rs = server.pstmt_getRowSet (p_vo); ResultSet rs = server.pstmt_getRowSet (p_vo, Adempiere.getSecurityToken());
p_vo.clearParameters(); // re-use of result set p_vo.clearParameters(); // re-use of result set
if (rs == null) if (rs == null)
log.warning("ResultSet is null - " + p_vo); log.warning("ResultSet is null - " + p_vo);
@ -198,7 +200,7 @@ public class CPreparedStatement extends CStatement implements PreparedStatement
Server server = CConnection.get().getServer(); Server server = CConnection.get().getServer();
if (server != null) if (server != null)
{ {
int result = server.stmt_executeUpdate (p_vo); int result = server.stmt_executeUpdate (p_vo, Adempiere.getSecurityToken());
p_vo.clearParameters(); // re-use of result set p_vo.clearParameters(); // re-use of result set
return result; return result;
} }
@ -886,7 +888,7 @@ public class CPreparedStatement extends CStatement implements PreparedStatement
Server server = CConnection.get().getServer(); Server server = CConnection.get().getServer();
if (server != null) if (server != null)
{ {
RowSet rs = server.pstmt_getRowSet (p_vo); RowSet rs = server.pstmt_getRowSet (p_vo, Adempiere.getSecurityToken());
p_vo.clearParameters(); // re-use of result set p_vo.clearParameters(); // re-use of result set
if (rs == null) if (rs == null)
log.warning("RowSet is null - " + p_vo); log.warning("RowSet is null - " + p_vo);

View File

@ -21,6 +21,7 @@ import java.util.logging.*;
import javax.sql.*; import javax.sql.*;
import org.compiere.Adempiere;
import org.compiere.db.*; import org.compiere.db.*;
import org.compiere.interfaces.*; import org.compiere.interfaces.*;
@ -136,7 +137,7 @@ public class CStatement implements Statement
Server server = CConnection.get().getServer(); Server server = CConnection.get().getServer();
if (server != null) if (server != null)
{ {
ResultSet rs = server.stmt_getRowSet (p_vo); ResultSet rs = server.stmt_getRowSet (p_vo, Adempiere.getSecurityToken());
if (rs == null) if (rs == null)
log.warning("ResultSet is null - " + p_vo); log.warning("ResultSet is null - " + p_vo);
else else
@ -198,7 +199,7 @@ public class CStatement implements Statement
Server server = CConnection.get().getServer(); Server server = CConnection.get().getServer();
if (server != null) if (server != null)
{ {
int result = server.stmt_executeUpdate(p_vo); int result = server.stmt_executeUpdate(p_vo, Adempiere.getSecurityToken());
p_vo.clearParameters(); // re-use of result set p_vo.clearParameters(); // re-use of result set
return result; return result;
} }
@ -867,7 +868,7 @@ public class CStatement implements Statement
Server server = CConnection.get().getServer(); Server server = CConnection.get().getServer();
if (server != null) if (server != null)
{ {
RowSet rs = server.stmt_getRowSet (p_vo); RowSet rs = server.stmt_getRowSet (p_vo, Adempiere.getSecurityToken());
p_vo.clearParameters(); // re-use of result set p_vo.clearParameters(); // re-use of result set
if (rs == null) if (rs == null)
log.warning("RowSet is null - " + p_vo); log.warning("RowSet is null - " + p_vo);

View File

@ -17,8 +17,13 @@
package org.compiere.util; package org.compiere.util;
import java.io.*; import java.io.*;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.security.cert.Certificate;
import java.util.*; import java.util.*;
import org.compiere.Adempiere;
/** /**
* Adempiere Statement Value Object * Adempiere Statement Value Object
* *

View File

@ -322,7 +322,7 @@ public class Login
list.toArray(retValue); list.toArray(retValue);
log.fine("User=" + app_user + " - roles #" + retValue.length); log.fine("User=" + app_user + " - roles #" + retValue.length);
} }
catch (SQLException ex) catch (Exception ex)
{ {
log.log(Level.SEVERE, sql.toString(), ex); log.log(Level.SEVERE, sql.toString(), ex);
log.saveError("DBLogin", ex); log.saveError("DBLogin", ex);

View File

@ -0,0 +1,29 @@
package org.compiere.util;
import java.io.Serializable;
import java.security.cert.Certificate;
/**
* @author Low Heng Sin
*/
public class SecurityToken implements Serializable {
private Certificate codeCertificate;
private String codeBaseHost;
public SecurityToken(Certificate cert, String host)
{
codeCertificate = cert;
codeBaseHost = host;
}
public Certificate getCodeCertificate()
{
return codeCertificate;
}
public String getCodeBaseHost()
{
return codeBaseHost;
}
}