/* * ==================== * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2008-2009 Sun Microsystems, Inc. All rights reserved. * * The contents of this file are subject to the terms of the Common Development * and Distribution License("CDDL") (the "License"). You may not use this file * except in compliance with the License. * * You can obtain a copy of the License at * http://IdentityConnectors.dev.java.net/legal/license.txt * See the License for the specific language governing permissions and limitations * under the License. * * When distributing the Covered Code, include this CDDL Header Notice in each file * and include the License file at identityconnectors/legal/license.txt. * If applicable, add the following below this CDDL Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * ==================== */ package org.identityconnectors.racf; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Array; import org.identityconnectors.common.StringUtil; import org.identityconnectors.common.script.Script; import org.identityconnectors.common.security.GuardedString; import org.identityconnectors.framework.common.exceptions.ConnectorException; import org.identityconnectors.framework.spi.AbstractConfiguration; import org.identityconnectors.framework.spi.ConfigurationProperty; import org.identityconnectors.rw3270.RW3270Configuration; public class RacfConfiguration extends AbstractConfiguration { //TODO _ldapUserName, _ldapPassword, _suffix, _isUseSsl, _hostLdapPortNumber seems to be LDAP specific private String _ldapUserName; private GuardedString _ldapPassword; private String _suffix; private Boolean _isUseSsl; private String _hostNameOrIpAddr; private Integer _hostLdapPortNumber; private Integer _hostTelnetPortNumber; private Integer _commandTimeout; private Integer _reaperMaximumIdle; private String[] _userQueries; private String[] _groupQueries; private String[] _userObjectClasses; private String[] _groupObjectClasses; private String[] _segmentNames; private String[] _segmentParsers; private String _parserFactory; private String[] _userNames; private GuardedString[]_passwords; private Script _connectScript; private Script _disconnectScript; private String _connectionClassName; private String[] _connectionProperties; private Boolean _asResetToday; private Boolean _asFilterUseOrSearch; private Boolean _asRemoveOCFromFilter; private String _asBlockSize; private String _asDecryptorClass; private String[] _asCertificate; private String[] _asPrivateKey; private String[] _asFilterChangesBy; private Boolean _isSunIdm = false; private Boolean _isTDS = true; private Boolean _convertToASCII = true; public RW3270Configuration getRW3270Configuration(int index) { return new RW3270ConfigurationProxy(this, index); } /* (non-Javadoc) * @see org.identityconnectors.racf.MessagesInterfac#getMessage(java.lang.String) */ public String getMessage(String key) { return getConnectorMessages().format(key, key); } /* (non-Javadoc) * @see org.identityconnectors.racf.MessagesInterfac#getMessage(java.lang.String, java.lang.Object) */ public String getMessage(String key, Object... objects) { return getConnectorMessages().format(key, key, objects); } private static final String GROUP_RACF_PARSER = "org/identityconnectors/racf/GroupRacfSegmentParser.xml"; private static final String RACF_PARSER = "org/identityconnectors/racf/RacfSegmentParser.xml"; private static final String CICS_PARSER = "org/identityconnectors/racf/CicsSegmentParser.xml"; private static final String OMVS_PARSER = "org/identityconnectors/racf/OmvsSegmentParser.xml"; private static final String TSO_PARSER = "org/identityconnectors/racf/TsoSegmentParser.xml"; private static final String NETVIEW_PARSER = "org/identityconnectors/racf/NetviewSegmentParser.xml"; private static final String CATALOG_PARSER = "org/identityconnectors/racf/CatalogParser.xml"; public RacfConfiguration() { setUserObjectClasses(new String[] { "racfUser", "SAFTsoSegment", "racfUserOmvsSegment", "racfUserOvmSegment", "racfCicsSegment", "racfDCESegment", "SAFDfpSegment", "racfKerberosInfo", "racfLanguageSegment", "racfLNotesSegment", "racfNDSSegment", "racfNetviewSegment", "racfOperparmSegment", "racfProxySegment", "racfWorkAttrSegment" }); setGroupObjectClasses(new String[] { "racfGroup", "racfGroupOvmSegment", "racfGroupOmvsSegment", "SAFDfpSegment" }); //setConnectScript(getLoginScript()); //setDisconnectScript(getLogoffScript()); setSegmentNames(new String[] { "ACCOUNT.RACF", "ACCOUNT.TSO", "ACCOUNT.NETVIEW", "ACCOUNT.CICS", "ACCOUNT.OMVS", "ACCOUNT.CATALOG", "ACCOUNT.OMVS", "GROUP.RACF" }); try { setSegmentParsers(new String[] { loadParserFromFile(RACF_PARSER), loadParserFromFile(TSO_PARSER), loadParserFromFile(NETVIEW_PARSER), loadParserFromFile(CICS_PARSER), loadParserFromFile(OMVS_PARSER), loadParserFromFile(CATALOG_PARSER), loadParserFromFile(OMVS_PARSER), loadParserFromFile(GROUP_RACF_PARSER) }); } catch (IOException ioe) { throw ConnectorException.wrap(ioe); } } private String loadParserFromFile(String fileName) throws IOException { BufferedReader is = new BufferedReader(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(fileName))); try { StringBuffer parser = new StringBuffer(); String line = null; while ((line=is.readLine())!=null) { parser.append(line+"\n"); } return parser.toString(); } finally { is.close(); } } // private Script getLoginScript() { // String script = // "connection.connect();\n" + // "connection.waitFor(\"PRESS THE ENTER KEY\", SHORT_WAIT);\n" + // "connection.send(\"TSO[enter]\");\n" + // "connection.waitFor(\"ENTER USERID -\", SHORT_WAIT);\n" + // "connection.send(USERNAME+\"[enter]\");\n" + // "connection.waitFor(\"Password ===>\", SHORT_WAIT);\n" + // "connection.send(PASSWORD);\n" + // "connection.send(\"[enter]\");\n" + // "connection.waitFor(\"\\\\*\\\\*\\\\*\", SHORT_WAIT);\n" + // "connection.send(\"[enter]\");\n" + // "connection.waitFor(\"Option ===>\", SHORT_WAIT);\n" + // "connection.send(\"[pf3]\");\n" + // "connection.waitFor(\" READY\\\\s{74}\", SHORT_WAIT);"; // ScriptBuilder builder = new ScriptBuilder(); // builder.setScriptLanguage("GROOVY"); // builder.setScriptText(script); // return builder.build(); // } // // private Script getLogoffScript() { // String script = "connection.send(\"LOGOFF[enter]\");\n"; // // "connection.send(\"LOGOFF[enter]\");\n" + // // "connection.waitFor(\"=====>\", SHORT_WAIT);\n" + // // "connection.dispose();\n"; // ScriptBuilder builder = new ScriptBuilder(); // builder.setScriptLanguage("GROOVY"); // builder.setScriptText(script); // return builder.build(); // } boolean isNoLdap() { return (StringUtil.isBlank(_suffix) || _hostLdapPortNumber==null || isBlank(_ldapPassword) || StringUtil.isBlank(_ldapUserName)); } boolean isNoCommandLine() { return isBlank(_userNames) || isBlank(_passwords); } public void validate() { // It's OK for all LDAP or all CommandLine connection info to be missing // but not both // boolean noLdap = isNoLdap(); boolean noCommandLine = isNoCommandLine(); if (noLdap && noCommandLine) throw new IllegalArgumentException(getMessage(RacfMessages.BAD_CONNECTION_INFO)); if (StringUtil.isBlank(_hostNameOrIpAddr)) throw new IllegalArgumentException(getMessage(RacfMessages.HOST_NULL)); if (!noLdap && StringUtil.isBlank(_suffix)) throw new IllegalArgumentException(getMessage(RacfMessages.SUFFIX_NULL)); if (!noLdap && _hostLdapPortNumber==null) throw new IllegalArgumentException(getMessage(RacfMessages.LDAP_PORT_NULL)); if (_hostLdapPortNumber!=null && (_hostLdapPortNumber<1 || _hostLdapPortNumber>65536)) throw new IllegalArgumentException(getMessage(RacfMessages.ILLEGAL_LDAP_PORT, _hostLdapPortNumber)); if (!noLdap && StringUtil.isBlank(_ldapUserName)) throw new IllegalArgumentException(getMessage(RacfMessages.USERNAME_NULL)); if (!noLdap && isBlank(_ldapPassword)) throw new IllegalArgumentException(getMessage(RacfMessages.PASSWORD_NULL)); if (!noLdap && _isUseSsl==null) throw new IllegalArgumentException(getMessage(RacfMessages.SSL_NULL)); if (!noCommandLine && _hostTelnetPortNumber==null) throw new IllegalArgumentException(getMessage(RacfMessages.TELNET_PORT_NULL)); if (!noCommandLine && _commandTimeout==null) throw new IllegalArgumentException(getMessage(RacfMessages.COMMAND_TIMEOUT_NULL)); if (!noCommandLine && _reaperMaximumIdle==null) throw new IllegalArgumentException(getMessage(RacfMessages.REAPER_MAX_IDLE_NULL)); if (_hostTelnetPortNumber!=null && (_hostTelnetPortNumber<1 || _hostTelnetPortNumber>65536)) throw new IllegalArgumentException(getMessage(RacfMessages.ILLEGAL_TELNET_PORT, _hostTelnetPortNumber)); if (!noCommandLine && isBlank(_userNames)) throw new IllegalArgumentException(getMessage(RacfMessages.USERNAMES_NULL)); if (!noCommandLine && isBlank(_passwords)) throw new IllegalArgumentException(getMessage(RacfMessages.PASSWORDS_NULL)); if (!noCommandLine && StringUtil.isBlank(_connectionClassName)) throw new IllegalArgumentException(getMessage(RacfMessages.CONNECTION_CLASS_NULL)); if (!noCommandLine && isBlank(_disconnectScript)) throw new IllegalArgumentException(getMessage(RacfMessages.DISCONNECT_SCRIPT_NULL)); if (!noCommandLine && isBlank(_connectScript)) throw new IllegalArgumentException(getMessage(RacfMessages.CONNECT_SCRIPT_NULL)); } boolean isBlank(Script script) { if (script==null) return true; return StringUtil.isBlank(script.getScriptText()); } boolean isBlank(GuardedString string) { if (string==null) return true; GuardedStringAccessor accessor = new GuardedStringAccessor(); string.access(accessor); boolean isBlank = accessor.getArray().length==0; accessor.clear(); return isBlank; } boolean isBlank(GuardedString[] strings) { if (strings.length==0) return true; boolean isBlank = false; for (GuardedString string : strings) { isBlank |= isBlank(string); } return isBlank; } boolean isBlank(String[] strings) { if (strings==null || strings.length==0) return true; boolean isBlank = false; for (String string : strings) { if (string==null) return true; isBlank |= string.length()==0; } return isBlank; } /** * Return LDAP suffix, such as cn=foo * @return RACF suffix (such as sysplex) */ @ConfigurationProperty(order=3, displayMessageKey="Suffix", helpMessageKey="SuffixHelp") public String getSuffix() { return _suffix; } /** * Set the LDAP Suffix. * @param suffix */ public void setSuffix(String suffix) { _suffix = suffix; } /** * {@inheritDoc} */ @ConfigurationProperty(order=7, displayMessageKey="SSL", helpMessageKey="SSLHelp") public Boolean getUseSsl() { return _isUseSsl; } /** * {@inheritDoc} */ public void setUseSsl(Boolean isUseSsl) { _isUseSsl = isUseSsl; } /** * Get the user name used for the LDAP connection. * @return LDAP user name */ @ConfigurationProperty(order=4, displayMessageKey="UserName", helpMessageKey="UserNameHelp") public String getLdapUserName() { return _ldapUserName; } /** * Set the user name for the LDAP connection. * <p> * Must be of the form * <code> * racfid=<b>name</b>,profileType=User,<b>suffix</b> * </code> * * @param userName -- user name */ public void setLdapUserName(String userName) { _ldapUserName = userName; } /** * Get the user object class names * @return an array of object class names */ @ConfigurationProperty(order=5, displayMessageKey="UserObjectClasses", helpMessageKey="UserObjectClassesHelp") public String[] getUserObjectClasses() { return arrayCopy(_userObjectClasses); } /** * Set the supported user object classes * @param userObjectClasses -- an array of object class names */ public void setUserObjectClasses(String[] userObjectClasses) { _userObjectClasses = arrayCopy(userObjectClasses); } /** * Get the user object class names * @return an array of object class names */ @ConfigurationProperty(order=5, displayMessageKey="GroupObjectClasses", helpMessageKey="GroupObjectClassesHelp") public String[] getGroupObjectClasses() { return arrayCopy(_groupObjectClasses); } /** * Set the supported group object classes * @param groupObjectClasses -- an array of object class names */ public void setGroupObjectClasses(String[] groupObjectClasses) { _groupObjectClasses = arrayCopy(groupObjectClasses); } /** * Get the user queries * @return an array of query strings that can fetch all users */ @ConfigurationProperty(order=5, displayMessageKey="UserQueries", helpMessageKey="UserQueriesHelp") public String[] getUserQueries() { return arrayCopy(_userQueries); } /** * Set the query strings that can fetch all users * @param userObjectClasses -- an array of query strings that can fetch all users */ public void setUserQueries(String[] userQueries) { _userQueries = arrayCopy(userQueries); } /** * Get the group queries * @return an array of query strings that can fetch all groups */ @ConfigurationProperty(order=5, displayMessageKey="GroupQueries", helpMessageKey="GroupQueriesHelp") public String[] getGroupQueries() { return arrayCopy(_groupQueries); } /** * Set the query strings that can fetch all groups * @param userObjectClasses -- an array of query strings that can fetch all groups */ public void setGroupQueries(String[] groupQueries) { _groupQueries = arrayCopy(groupQueries); } /** * Get the password for the LDAP connection * @return LDAP password */ @ConfigurationProperty(order=5, displayMessageKey="Password", helpMessageKey="PasswordHelp", confidential=true) public GuardedString getLdapPassword() { return _ldapPassword; } /** * Set the password for the LDAP connection * @param password -- LDAP password */ public void setLdapPassword(GuardedString password) { _ldapPassword = password; } /** * {@inheritDoc} */ @ConfigurationProperty(order=1, displayMessageKey="HostName", helpMessageKey="HostNameHelp") public String getHostNameOrIpAddr() { return _hostNameOrIpAddr; } /** * {@inheritDoc} */ public void setHostNameOrIpAddr(String hostNameOrIpAddr) { _hostNameOrIpAddr = hostNameOrIpAddr; } /** * {@inheritDoc} */ @ConfigurationProperty(order=6, displayMessageKey="HostTelnetPort", helpMessageKey="HostTelnetPortHelp") public Integer getHostTelnetPortNumber() { return _hostTelnetPortNumber; } /** * {@inheritDoc} */ public void setHostTelnetPortNumber(Integer hostPortNumber) { _hostTelnetPortNumber = hostPortNumber; } /** * Get the port number for the LDAP connection * @return LDAP port number */ @ConfigurationProperty(order=2, displayMessageKey="HostLdapPort", helpMessageKey="HostLdapPortHelp") public Integer getHostPortNumber() { return _hostLdapPortNumber; } /** * Set the port number for the LDAP connection * @param hostPortNumber -- LDAP port number */ public void setHostPortNumber(Integer hostPortNumber) { _hostLdapPortNumber = hostPortNumber; } // private String escape(String string) { // return string.replaceAll("#", "\\#"); // } @ConfigurationProperty(order=8) public String[] getUserNames() { return arrayCopy(_userNames); } public void setUserNames(String[] names) { _userNames = arrayCopy(names); } @ConfigurationProperty(order=9, confidential=true) public GuardedString[] getPasswords() { return arrayCopy(_passwords); } public void setPasswords(GuardedString[] passwords) { _passwords = arrayCopy(passwords); } @ConfigurationProperty(order=19, confidential=true) public String[] getConnectionProperties() { return arrayCopy(_connectionProperties); } public void setConnectionProperties(String[] properties) { _connectionProperties = arrayCopy(properties); } @ConfigurationProperty(order=11) public String[] getSegmentNames() { return arrayCopy(_segmentNames); } public void setSegmentNames(String[] names) { _segmentNames = arrayCopy(names); } @ConfigurationProperty(order=14) public String[] getSegmentParsers() { return arrayCopy(_segmentParsers); } public void setSegmentParsers(String[] segmentParsers) { _segmentParsers = arrayCopy(segmentParsers); } @ConfigurationProperty(order=14) public String getParserFactory() { return _parserFactory; } public void setParserFactory(String parserFactory) { _parserFactory = parserFactory; } /** * {@inheritDoc} */ @ConfigurationProperty(order=16) public Script getConnectScript() { return _connectScript; } /** * {@inheritDoc} */ public void setConnectScript(Script script) { _connectScript = script; } /** * {@inheritDoc} */ @ConfigurationProperty(order=16) public Script getDisconnectScript() { return _disconnectScript; } /** * {@inheritDoc} */ public void setDisconnectScript(Script script) { _disconnectScript = script; } /** * {@inheritDoc} */ @ConfigurationProperty(order=14) public Integer getCommandTimeout() { return _commandTimeout; } /** * {@inheritDoc} */ public void setCommandTimeout(Integer commandTimeout) { _commandTimeout = commandTimeout; } /** * {@inheritDoc} */ @ConfigurationProperty(order=14) public Integer getReaperMaximumIdleTime() { return _reaperMaximumIdle; } /** * {@inheritDoc} */ public void setReaperMaximumIdleTime(Integer reaperMaximumIdle) { _reaperMaximumIdle = reaperMaximumIdle; } /** * {@inheritDoc} */ @ConfigurationProperty(order=13) public String getConnectionClassName() { return _connectionClassName; } /** * {@inheritDoc} */ public void setConnectionClassName(String className) { _connectionClassName = className; } @ConfigurationProperty public String[] getActiveSyncCertificate() { return arrayCopy(_asCertificate); } public void setActiveSyncCertificate(String[] certificate) { _asCertificate = arrayCopy(certificate); } @ConfigurationProperty public String[] getActiveSyncPrivateKey() { return arrayCopy(_asPrivateKey); } public void setActiveSyncPrivateKey(String[] privateKey) { _asPrivateKey = arrayCopy(privateKey); } @ConfigurationProperty public String[] getActiveSyncFilterChangesBy() { return arrayCopy(_asFilterChangesBy); } public void setActiveSyncFilterChangesBy(String[] filterChangesBy) { _asFilterChangesBy = arrayCopy(filterChangesBy); } @ConfigurationProperty public String getActiveSyncBlocksize() { return _asBlockSize; } public void setActiveSyncBlocksize(String blockSize) { _asBlockSize = blockSize; } @ConfigurationProperty public Boolean getActiveSyncResetToToday() { return _asResetToday; } public void setActiveSyncResetToToday(Boolean asResetToday) { _asResetToday = asResetToday; } @ConfigurationProperty public Boolean getActiveSyncFilterUseOrSearch() { return _asFilterUseOrSearch; } public void setActiveSyncFilterUseOrSearch(Boolean useOrSearch) { _asFilterUseOrSearch = useOrSearch; } @ConfigurationProperty public Boolean getActiveSyncRemoveOCFromFilter() { return _asRemoveOCFromFilter; } public void setActiveSyncRemoveOCFromFilter(Boolean removeOCFromFilter) { _asRemoveOCFromFilter = removeOCFromFilter; } @ConfigurationProperty public String getActiveSyncPasswordDecryptorClass() { return _asDecryptorClass; } public void setActiveSyncPasswordDecryptorClass(String decryptorClass) { _asDecryptorClass = decryptorClass; } @ConfigurationProperty public boolean getIsSunIdm(){ return _isSunIdm; } public void setIsSunIdm(boolean sunIdm){ _isSunIdm = sunIdm; } @ConfigurationProperty public boolean getIsTivoliDirectoryServer(){ return _isTDS; } public void setIsTivoliDirectoryServer(boolean TDS){ _isTDS = TDS; } @ConfigurationProperty public boolean getConvertToASCII(){ return _convertToASCII; } public void setConvertToASCII(boolean convert){ _convertToASCII = convert; } @SuppressWarnings("unchecked") private <T> T[] arrayCopy(T[] array) { if (array==null) return null; T [] result = (T[])Array.newInstance(array.getClass().getComponentType(), array.length); System.arraycopy(array, 0, result, 0, result.length); return result; } }