5.4 Understanding the Custom Rule Class Example

The following example explains how to create a custom rule class:

import java.util.Base64;
import java.util.Map;
import java.util.Properties;
import com.novell.nam.nidp.risk.context.DeviceContext;
import com.novell.nam.nidp.risk.context.HTTPContext;
import com.novell.nam.nidp.risk.context.LocationContext;
import com.novell.nam.nidp.risk.context.UserContext;
import com.novell.nam.nidp.risk.core.rules.Rule;
import com.novell.nam.nidp.risk.util.ResponseObject;
public class CustomRuleTmpl extends Rule {
  /**
   * @param configProps
   * All the configuration will be passed to the constructor.
   * 
   * Pass the type of user historical data you want.
   * 
   */
   public CustomRuleTmpl(Properties configProps) {super(configProps);
                 
   /*
   * Check all the properties that is configured
        */
  		printProperties(configProps);
    if ( isHistoricalDataEnabled())
			{
			// Enter all the user attributes that you need from the history database
// Generally you would need one or two values.      setType(HistoricalAttributeEntries.IP.name());
    /*
* Following commented code shows the way to get other 
* historical data from database.
*   	setType(HistoricalAttributeEntries.LASTLOGGEDINTIME.name());
*   setType(HistoricalAttributeEntries.CITY.name())
*   	setType(HistoricalAttributeEntries.COUNTRY.name());
*   setType(HistoricalAttributeEntries.REGION.name());
*	   setType(HistoricalAttributeEntries.RISKSCORE.name());
*   setType(HistoricalAttributeEntries.LOGINRESULT.name());
*	   setType(HistoricalAttributeEntries.RISKCATEGORY.name());
*   setType(HistoricalAttributeEntries.RISKSCORE.name());
*	   setType(HistoricalAttributeEntries.REGIONCODE.name());
*   setType(HistoricalAttributeEntries.METROCODE.name());
*	    setType(HistoricalAttributeEntries.POSTCODE.name());
     *
     *
     * Or you could even set it using an array List
		 * 	clearType(); // Clear the previously set rule type values
   *  ArrayList<String> historyAttributes = newArrayList<String>();
   *  historyAttributes.add ( HistoricalAttributeEntries.IP.name());
   * historyAttributes.add (HistoricalAttributeEntries.LASTLOGGEDINTIME.name());
   *  setType(historyAttributes);
   */      
    }  
  }
private void printProperties(Properties configProps) {
    System.out.println("Configured properties are: -");
    		for (Entry<Object, Object> e: configProps.entrySet())
    System.out.println("Name :" + e.getKey() + "Value : " + e.getValue());
}
  /* (non-Javadoc)
	 * @see com.novell.nam.nidp.risk.core.rules.Rule#evaluate(com.novell.nam.nidp.risk.context.HTTPContext,
com.novell.nam.nidp.risk.context.LocationContext, com.novell.nam.nidp.risk.context.DeviceContext,
com.novell.nam.nidp.risk.context.UserContext, com.novell.nam.nidp.risk.util.ResponseObject)
   *
   * This method evaluates the rule and is called in the order of the priority.
   * 
   * Parameters 
   * HttpContext - Contains all the request http header information
   * LocationContext - Contains information about the client location ( IP )
   * DeviceContext - Contains device information
   * UserContext  - Contains user information, that includes, user attributes, roles and historical login data of the user.
   *   ResponseObject -  Can be used for setting cookies, headers and user attributes on completion of the risk calculation.
   * 
	   * Return Values
   * true - on successful evaluation of the rule.
  	 * false - if failed to evaluate the rule. In this case configured risk score will be considered.
	  *   
  *   This method will have 3 sections
	  * 1 ) Pre-evaluation : - To get all the parameters of the user login
  * 2 ) Evaluate the rule : - Apply the use case to the evaluation using the parameters
   *   3 ) Post-evaluation : - Set result, cookie and history parameters if needed
	 */

@Override
    public boolean evaluate(HTTPContext httpContext, LocationContext
    lContext,			DeviceContext dContext, UserContext uContext,
    ResponseObject rspObject) {
    boolean returnValue = false;
    if ( m_ruleEnabled)
			{
			/* ######## Pre-Evaluation Section #####################*/
      getHTTPHeaderInformation(httpContext);
      getCookieInformation(httpContext, "JSESSIONID");
      getLocationParameter(lContext);
      getUserContext(uContext);
      /* ############### Evaluation Section ####################*/
      { 
        /*
         * Change the return value according logic of the
 *   evaluation
         */
if ( true )
             returnValue = true;
        }
      /* ############### Post-Evaluation Section ####################*/
      /*
 * Execute the post evaluation method to consider other configuration like negate result
       */
//  rspObject.setUserAttr(HistoricalAttributeEntries.IP.name(), clientIP);
  
 return getReturnValue(returnValue); 
          }
    return true;
		}
			
    /*
   * Get all the user context/attributes
	 */
    private void getUserContext(UserContext uContext) {
      // TODO Auto-generated method stub
    getUserAttribute(uContext);
    getUserRoles(uContext);
    getHistoricalData(uContext);
  }
  /*
   * Get the historical data of the user from the configured DataBase
   */
    private void getHistoricalData(UserContext uContext) {
    // It will get all the passed transaction for the user in the past.
    // If the transaction you looking for is not found, that mean it has failed for that log in.
    HistoryRecord records = (HistoryRecord)uContext.get(HistoricalAttributeEntries.IP.name());
    if ( records != null)
			{	
      System.out.println("Printing past entries from the History, in this example its the IP used by the user");
      for( Object o : records.getValue() )
							System.out.println("< " + (String)o + "
>\n");
    }
    }
  /*
     * Get the user's current role information
		 */
      private void getUserRoles(UserContext uContext) {
String[] values = (String[])
uContext.get(UserProfile.Constants.ROLES.name());
    RiskLog.debug("Roles of the user are ");
			for ( String role : values)
      RiskLog.debug(" " + role + ",");
		}
  /*
  * Get the user's ldap attributes.
		  * 
  * NOTE: To get attributes here, you must return
the name of the attributes    you need, using method getRequiredAttributes();

   */
	 	private void getUserAttribute(UserContext uContext) {
   // Value will be null if attribute name is not set as part of getRequiredAttributes()
    String mail = (String) uContext.get("mail");
		String carlicense = (String) uContext.get("carlicense");
    System.out.println("Mail attribute of the user is " + mail + ",
and the carlicense is " + carlicense);
  }
    
	/*
	 *  This method should return the name of the user ldap attributes required during evaluation of the rule.
	 *  You could configure those in the custom rule properties and can pass the value here.
	 */
     @Override
	 	public String[] getRequiredAttributes() {
	 			// TODO Auto-generated method stub
         String[] attributes = new String[2];
    attributes[0] = "mail";
			attributes[1] = "carlicense";
      return attributes;
		}
  /*
  * Get the location parameter of the user
 	 * 
  */
	private void getLocationParameter(LocationContext lContext) {
    String clientIP = lContext.getClientIPAddress();
			RiskLog.debug("Client Ip address for this request is = " + clientIP);		
    Properties props = new Properties();
			Provider provider;
   
   		try {
 			provider = GeoLocationFactory.getProvider
       RiskEngine.getInstance().getCoreProps().getProperty("geolocation.provider"),
		null, props);
      GeoLocBean geoLoc = provider.readGeoLocInfo(InetAddress
						.getByName(clientIP));
      System.out.println("Country  = " + geoLoc.getCountry());
				System.out.println("Country code = " + geoLoc.getCountryCode());
        System.out.println("City  = " + geoLoc.getCity());
				} catch (GeoLocException | UnknownHostException
e) {
      // TODO Auto-generated catch block
					System.out.println("Geo location configuration exception
" + e.getLocalizedMessage());
			e.printStackTrace();
          }
  }
  /*
   * Get a spefic cookie out of headers
  		 */
      private void getCookieInformation(HTTPContext httpContext,
String cookieName) {
    String cookieValue = httpContext.getCookieValue(cookieName);
    RiskLog.debug("Cookie Name = " + cookieName + "
Value = " + cookieValue);
  }
  /*
       * Get all http Context information.
		    	   * Contains all http headers that is part of the request, including cookies.
   */ 
     private void getHTTPHeaderInformation(HTTPContext httpContext) {
      Map<String, String> headers = httpContext.getM_HTTPHeaders();
      Iterator itr = headers.entrySet().iterator();
      for  ( Map.Entry< String, String> entry : headers.entrySet()
)
        RiskLog.debug("Header Name = " + entry.getKey()
 + " Value = " + entry.getValue());
  }
}