Appendix B. Sample Web Express Logon plug-in

This sample plug-in illustrates the directions in Creating plugins for Web Express Logon for creating a Network Security or Credential Mapper plug-in. It uses the CMResponse object to return parameters and status. You can use this sample as a guide for creating your own plug-ins. This sample does not retrieve information; it simply returns values that are coded as constants. Your plug-in must add logic to retrieve the needed information.

////////////////////////////////////////////////////////////////////////////////
//  HATS V6.0 sample plug-in for either Network Security or
//  Credential Mapper purposes
//
//  This sample is provided AS IS.
//  Permission to use, copy and modify this software for any purpose and
//  without fee is hereby granted. provided that the name of IBM not be used in
//  advertising or publicity pertaining to distribution of the software without
//  specific written permission.
//
//  IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SAMPLE, INCLUDING ALL
//  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL IBM
//  BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
//  DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
//  IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
//  OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SAMPLE.
////////////////////////////////////////////////////////////////////////////////

package com.ibm.hats.common.wel;

import com.ibm.eNetwork.security.sso.*;
import com.ibm.eNetwork.security.sso.cms.*;
import com.ibm.eNetwork.HOD.common.PasswordCipher;
import java.util.Properties;
import java.util.Enumeration;

public class CMPIHardCode implements CMInterface
{
    private static final String className = "com.ibm.hats.common.wel.CMPIHardCode";
    private static final String KEY_USERID          = "CMPI_HARD_CODE_USERID";
    private static final String KEY_PASSWORD        = "CMPI_HARD_CODE_PASSWORD";
    private static final String KEY_STATUS          = "CMPI_HARD_CODE_STATUS";
    private static final String KEY_TRACE_LEVEL     = "CMPI_HARD_CODE_TRACE_LEVEL";
    private static final int    DEFAULT_TRACE_LEVEL = Ras.TRACE_NONE;

    // Configured parameters to this plugin
    private String userID;
    private String password;
    private int    status;
    private int    traceLevel;
    private boolean initOK = true;
    private String cmID = null;
    private Properties pInit = null;

    public int Init(Properties p, String id)
    {
        this.pInit  = p;
        this.cmID   = id;
        this.initOK = true;
        userID   = getProperty(KEY_USERID);
        password = getProperty(KEY_PASSWORD);
        status          = Integer.parseInt(getProperty(KEY_STATUS));
        String traceStr = getProperty(KEY_TRACE_LEVEL);

        if ( traceStr != null )
            traceLevel = Integer.parseInt(traceStr);
        else
            traceLevel = DEFAULT_TRACE_LEVEL;
        return( this.initOK ? SSOConstants.SSO_SUCCESS
                            : SSOConstants.SSO_INVALID_PARAMETER );
    }
    /**
     *  This sample plugin has no actions to take at destroy time
     */
    public void Destroy()
    {
    }

    /**
     * Retrieve the requested credentials here, and return them to Credential Mapper
     */
    public CMResponse CMSGetUserCredentials(CMRequest req)
    {
        // Perform whatever business logic is needed here to assign credentials.
        // This testing sample just returns the plugin's configured values.
        CMResponse resp = new CMResponse(userID, password, status);
        return( resp );
    }

    /**
     *  Return plugin information to the Studio Web Express Logon Editor
     */
    public String getName()
    {
        return( "Fixed credentials (for testing)" );
    }
    public String getDescription()
    {
        return( "Hard-codes returned credentials based on parameters (for testing)" );
    }
    public String getAuthor()
    {
        return( "Plugin author, for example IBM Corporation" );
    }

    /**
     * Return the list of parameters this plugin uses/allows to
     * the Studio Web Express Logon Editor
     */
    String strParms[] = { KEY_USERID, KEY_PASSWORD, KEY_STATUS};
    public String[] getParameters()
    {
        return( strParms );
    }

    /**
     * Return information about the requested parameter to the
     *  Studio Web Express Logon Editor
     */
    public Properties getParameterInfo(String strParm)
    {
        Properties p = new Properties();
        if ( KEY_USERID.equals(strParm) )
        {
            p.put(CMInterface.cmiRequired, "true");
        }
        else if ( KEY_PASSWORD.equals(strParm) )
        {
            p.put(CMInterface.cmiRequired, "true");
            p.put(CMInterface.cmiEncrypted, "true");
        }
        else if ( KEY_STATUS.equals(strParm) )
        {
            p.put(CMInterface.cmiRequired, "true");
            p.put(CMInterface.cmiDefaultValue,
                  Integer.toString(SSOConstants.SSO_SUCCESS));
        }
        else if ( KEY_TRACE_LEVEL.equals(strParm) )
        {
            p.put(CMInterface.cmiRequired, "false");
            p.put(CMInterface.cmiDefaultValue,
                  Integer.toString(DEFAULT_TRACE_LEVEL));
        }
        return( p );
    }

    /**
     * Retrieve the parameter value
     */
    private String getProperty(String propName)
    {
        final String methodName = "getProperty";

        if ( traceLevel >= Ras.TRACE_MAXIMUM )
            Ras.traceEntry(className, methodName, propName);

        boolean requiredParm =
            "true".equals(getParameterInfo(propName).
                          getProperty(CMInterface.cmiRequired));
        boolean encryptedParm =
            "true".equals(getParameterInfo(propName).
                          getProperty(CMInterface.cmiEncrypted));
        String value = pInit.getProperty(cmID + propName);  // must use cmID prefix !!

        if ( value == null || value.trim().equals("") )
        {
            value = pInit.getProperty(propName);
        }
        if ( (value == null || value.trim().equals("")) && requiredParm )
        {
            if ( traceLevel >= Ras.TRACE_MINIMUM )
                Ras.logMessage(Ras.MSG_ERROR, className, methodName,
                               "PARAMETER_ERROR", propName);
            initOK = false;
        }
        else if ( encryptedParm )
            value = PasswordCipher.decrypt(value);

        if ( traceLevel >= Ras.TRACE_MAXIMUM )
            Ras.traceExit(className, methodName, (encryptedParm ? "********"
                                                                : value));

        return( value );
    }
}