Search in sources :

Example 1 with LoginFault

use of com.sforce.soap.partner.fault.LoginFault in project components by Talend.

the class SalesforceSessionReuseTestIT method testUseExistingConnection.

@Ignore("Need to solve test failed randomly")
@Test(timeout = 30_000)
public void testUseExistingConnection() throws Throwable {
    File sessionFolder = new File(tempFolder.getRoot().getPath() + "/tsalesforceconnection_1/");
    assertEquals(0, sessionFolder.getTotalSpace());
    LOGGER.debug("session folder: " + sessionFolder.getAbsolutePath());
    SalesforceConnectionProperties connProps = (SalesforceConnectionProperties) getComponentService().getComponentProperties(TSalesforceConnectionDefinition.COMPONENT_NAME);
    setupProps(connProps, !ADD_QUOTES);
    // setup session function
    connProps.reuseSession.setValue(true);
    connProps.sessionDirectory.setValue(sessionFolder.getAbsolutePath());
    final String currentComponentName = TSalesforceConnectionDefinition.COMPONENT_NAME + "_1";
    final java.util.Map<String, Object> globalMap = new java.util.HashMap<String, Object>();
    RuntimeContainer connContainer = new DefaultComponentRuntimeContainerImpl() {

        @Override
        public String getCurrentComponentId() {
            return currentComponentName;
        }

        @Override
        public Object getComponentData(String componentId, String key) {
            return globalMap.get(componentId + "_" + key);
        }

        @Override
        public void setComponentData(String componentId, String key, Object data) {
            globalMap.put(componentId + "_" + key, data);
        }

        @Override
        public Object getGlobalData(String key) {
            return globalMap.get(key);
        }
    };
    // 1. salesforce connection would save the session to a session file
    SalesforceSourceOrSink salesforceSourceOrSink = new SalesforceSourceOrSink();
    salesforceSourceOrSink.initialize(connContainer, connProps);
    assertEquals(ValidationResult.Result.OK, salesforceSourceOrSink.validate(connContainer).getStatus());
    // 2. set a wrong pwd to connection properties
    connProps.userPassword.password.setValue(WRONG_PWD);
    // Input component get connection from the tSalesforceConnection
    TSalesforceInputProperties inProps = (TSalesforceInputProperties) getComponentService().getComponentProperties(TSalesforceInputDefinition.COMPONENT_NAME);
    inProps.connection.referencedComponent.componentInstanceId.setValue(currentComponentName);
    inProps.connection.referencedComponent.setReference(connProps);
    checkAndAfter(inProps.connection.referencedComponent.getReference().getForm(Form.REFERENCE), "referencedComponent", inProps.connection);
    ComponentTestUtils.checkSerialize(inProps, errorCollector);
    assertEquals(2, inProps.getForms().size());
    Form f = inProps.module.getForm(Form.REFERENCE);
    assertTrue(f.getWidget("moduleName").isCallBeforeActivate());
    ComponentProperties moduleProps = (ComponentProperties) f.getProperties();
    try {
        // 3. input components would be get connection from connection session file
        moduleProps = (ComponentProperties) PropertiesTestUtils.checkAndBeforeActivate(getComponentService(), f, "moduleName", moduleProps);
        Object connection = connContainer.getComponentData(currentComponentName, SalesforceSourceOrSink.KEY_CONNECTION);
        assertNotNull(connection);
        ((PartnerConnection) connection).getConfig().setPassword(WRONG_PWD);
        // Check whether the session disable by other test.
        ((PartnerConnection) connection).getUserInfo();
        Property<?> prop = (Property<?>) f.getWidget("moduleName").getContent();
        assertTrue(prop.getPossibleValues().size() > 100);
        LOGGER.debug(moduleProps.getValidationResult().toString());
        assertEquals(ValidationResult.Result.OK, moduleProps.getValidationResult().getStatus());
        invalidSession(connProps, null);
        // This means that the session is disabled by current test
        // 4. invalid the session, then the session should be renew based on reference connection information(wrong pwd)
        // connect would be fail
        moduleProps = (ComponentProperties) PropertiesTestUtils.checkAndBeforeActivate(getComponentService(), f, "moduleName", moduleProps);
        assertEquals(ValidationResult.Result.ERROR, moduleProps.getValidationResult().getStatus());
        LOGGER.debug(moduleProps.getValidationResult().toString());
    } catch (ConnectionException e) {
        // Maybe get exception when same account run in parallel
        // The session maybe disabled by other test
        assertThat(e, instanceOf(LoginFault.class));
        assertEquals(ExceptionCode.INVALID_LOGIN, ((LoginFault) e).getExceptionCode());
        LOGGER.debug("session is disabled by other test!");
    }
    // 5.set correct pwd back
    setupProps(connProps, !ADD_QUOTES);
    moduleProps = (ComponentProperties) PropertiesTestUtils.checkAndBeforeActivate(getComponentService(), f, "moduleName", moduleProps);
    assertEquals(ValidationResult.Result.OK, moduleProps.getValidationResult().getStatus());
    LOGGER.debug(moduleProps.getValidationResult().toString());
}
Also used : ComponentProperties(org.talend.components.api.properties.ComponentProperties) SalesforceConnectionProperties(org.talend.components.salesforce.SalesforceConnectionProperties) DefaultComponentRuntimeContainerImpl(org.talend.components.api.container.DefaultComponentRuntimeContainerImpl) Form(org.talend.daikon.properties.presentation.Form) PartnerConnection(com.sforce.soap.partner.PartnerConnection) LoginFault(com.sforce.soap.partner.fault.LoginFault) TSalesforceInputProperties(org.talend.components.salesforce.tsalesforceinput.TSalesforceInputProperties) File(java.io.File) Property(org.talend.daikon.properties.property.Property) ConnectionException(com.sforce.ws.ConnectionException) RuntimeContainer(org.talend.components.api.container.RuntimeContainer) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 2 with LoginFault

use of com.sforce.soap.partner.fault.LoginFault in project components by Talend.

the class SalesforceSessionReuseTestIT method testOutputReuseSession.

@Ignore("Need to solve test failed randomly")
@Test(timeout = 30_000)
public void testOutputReuseSession() throws Throwable {
    File sessionFolder = new File(tempFolder.getRoot().getPath() + "/tsalesforceoutput/");
    assertEquals(0, sessionFolder.getTotalSpace());
    LOGGER.debug("session folder: " + sessionFolder.getAbsolutePath());
    // $NON-NLS-1$
    TSalesforceOutputProperties props = (TSalesforceOutputProperties) new TSalesforceOutputProperties("foo").init();
    props.module.moduleName.setValue(EXISTING_MODULE_NAME);
    props.module.main.schema.setValue(getMakeRowSchema(false));
    props.connection = setupProps(null, !ADD_QUOTES);
    // setup session function
    props.connection.reuseSession.setValue(true);
    props.connection.sessionDirectory.setValue(sessionFolder.getAbsolutePath());
    // Init session
    assertEquals(ValidationResult.Result.OK, testConnection(props).getStatus());
    assertNotEquals(0, sessionFolder.getTotalSpace());
    // Invalid session, test whether it can be renew the session
    invalidSession(props.connection, null);
    // length=260
    String invalidName = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    List<IndexedRecord> records = new ArrayList<>();
    IndexedRecord r1 = new GenericData.Record(props.module.main.schema.getValue());
    r1.put(0, invalidName);
    records.add(r1);
    try {
        doWriteRows(props, records);
    } catch (IOException e) {
        // means exception caused by "Name" too long
        assertTrue(e.getMessage().contains(invalidName));
        LOGGER.debug("expect exception: " + e.getMessage());
    }
    // Set wrong pwd to test reuse session from session folder
    props.connection.userPassword.password.setValue(WRONG_PWD);
    try {
        doWriteRows(props, records);
    } catch (IOException e) {
        Throwable caused = e.getCause();
        if (caused != null && caused instanceof LoginFault) {
            // Maybe throw exception when same account run in parallel
            // The session maybe disabled by other test
            assertEquals(ExceptionCode.INVALID_LOGIN, ((LoginFault) caused).getExceptionCode());
            LOGGER.debug("session is disabled by other test!");
        } else {
            // means exception caused by "Name" too long
            assertTrue(e.getMessage().contains(invalidName));
            LOGGER.debug("expect exception: " + e.getMessage());
            // This means that the session not disabled by other test
            invalidSession(props.connection, null);
        // This means that the session is disabled by current test
        }
    }
    // Test reuse session fails with wrong pwd
    try {
        doWriteRows(props, records);
    } catch (IOException e) {
        Throwable caused = e.getCause();
        // Should login fails with wrong pwd
        assertThat(caused, instanceOf(LoginFault.class));
        assertEquals(ExceptionCode.INVALID_LOGIN, ((LoginFault) caused).getExceptionCode());
        LOGGER.debug("expect login fails: " + e.getMessage());
    }
    // Disable reuse session function
    props.connection.reuseSession.setValue(false);
    LOGGER.debug("expect login fails:");
    assertEquals(ValidationResult.Result.ERROR, testConnection(props).getStatus());
}
Also used : TSalesforceOutputProperties(org.talend.components.salesforce.tsalesforceoutput.TSalesforceOutputProperties) IndexedRecord(org.apache.avro.generic.IndexedRecord) LoginFault(com.sforce.soap.partner.fault.LoginFault) ArrayList(java.util.ArrayList) IndexedRecord(org.apache.avro.generic.IndexedRecord) IOException(java.io.IOException) File(java.io.File) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 3 with LoginFault

use of com.sforce.soap.partner.fault.LoginFault in project components by Talend.

the class SalesforceSessionReuseTestIT method testInputReuseSession.

/*
    * If the logic changes for this test please specify appropriate timeout.
    * The average execution time for this test 3.2-4.7 sec.
    */
@Test(timeout = 40_000)
public void testInputReuseSession() throws Throwable {
    File sessionFolder = new File(tempFolder.getRoot().getPath() + "/tsalesforceinput/");
    assertEquals(0, sessionFolder.getTotalSpace());
    LOGGER.debug("session folder: " + sessionFolder.getAbsolutePath());
    // $NON-NLS-1$
    TSalesforceInputProperties props = (TSalesforceInputProperties) new TSalesforceInputProperties("foo").init();
    props.module.moduleName.setValue(EXISTING_MODULE_NAME);
    props.module.main.schema.setValue(getMakeRowSchema(false));
    props.connection = setupProps(null, !ADD_QUOTES);
    // setup session function
    props.connection.reuseSession.setValue(true);
    props.connection.sessionDirectory.setValue(sessionFolder.getAbsolutePath());
    // Init session
    assertEquals(ValidationResult.Result.OK, testConnection(props).getStatus());
    assertNotEquals(0, sessionFolder.getTotalSpace());
    // Invalid session, test whether it can be renew the session
    invalidSession(props.connection, null);
    List<IndexedRecord> records = readRows(props);
    assertNotNull(records);
    LOGGER.debug("current records number in module " + EXISTING_MODULE_NAME + ": " + records.size());
    assertNotEquals(0, records.size());
    // Set wrong pwd to test reuse session from session folder
    props.connection.userPassword.password.setValue(WRONG_PWD);
    try {
        testConnection(props);
        records = readRows(props);
        assertNotNull(records);
        LOGGER.debug("current records number in module " + EXISTING_MODULE_NAME + ": " + records.size());
        assertNotEquals(0, records.size());
        // Test reuse session fails with wrong pwd
        invalidSession(props.connection, null);
    // This means that the session is disabled by current test
    } catch (IOException e) {
        Throwable caused = e.getCause();
        // Maybe get exception when same account run in parallel
        // The session maybe disabled by other test
        assertThat(caused, instanceOf(LoginFault.class));
        assertEquals(ExceptionCode.INVALID_LOGIN, ((LoginFault) caused).getExceptionCode());
        LOGGER.debug("session is disabled by other test!");
    }
    try {
        readRows(props);
    } catch (IOException e) {
        Throwable caused = e.getCause();
        // Should login fails with wrong pwd
        assertThat(caused, instanceOf(LoginFault.class));
        assertEquals(ExceptionCode.INVALID_LOGIN, ((LoginFault) caused).getExceptionCode());
        LOGGER.debug("expect login fails: " + e.getMessage());
    }
    // Disable reuse session function
    props.connection.reuseSession.setValue(false);
    LOGGER.debug("expect login fails:");
    assertEquals(ValidationResult.Result.ERROR, testConnection(props).getStatus());
}
Also used : IndexedRecord(org.apache.avro.generic.IndexedRecord) LoginFault(com.sforce.soap.partner.fault.LoginFault) IOException(java.io.IOException) TSalesforceInputProperties(org.talend.components.salesforce.tsalesforceinput.TSalesforceInputProperties) File(java.io.File) Test(org.junit.Test)

Example 4 with LoginFault

use of com.sforce.soap.partner.fault.LoginFault in project components by Talend.

the class SalesforceSourceOrSinkTestIT method testSalesForcePasswordExpired.

@Test(expected = ConnectionException.class)
public void testSalesForcePasswordExpired() throws ConnectionException {
    SalesforceSourceOrSink salesforceSourceOrSink = new SalesforceSourceOrSink();
    TSalesforceInputProperties properties = (TSalesforceInputProperties) new TSalesforceInputProperties(null).init();
    salesforceSourceOrSink.initialize(null, properties);
    ConnectorConfig config = new ConnectorConfig();
    config.setUsername(StringUtils.strip(USER_ID_EXPIRED, "\""));
    String password = StringUtils.strip(PASSWORD_EXPIRED, "\"");
    String securityKey = StringUtils.strip(SECURITY_KEY_EXPIRED, "\"");
    if (StringUtils.isNotEmpty(securityKey)) {
        password = password + securityKey;
    }
    config.setPassword(password);
    PartnerConnection connection = null;
    try {
        connection = salesforceSourceOrSink.doConnection(config, true);
    } catch (LoginFault ex) {
        Assert.fail("Must be an exception related to expired password, not the Login Fault.");
    } finally {
        if (null != connection) {
            connection.logout();
        }
    }
}
Also used : ConnectorConfig(com.sforce.ws.ConnectorConfig) PartnerConnection(com.sforce.soap.partner.PartnerConnection) LoginFault(com.sforce.soap.partner.fault.LoginFault) TSalesforceInputProperties(org.talend.components.salesforce.tsalesforceinput.TSalesforceInputProperties) Test(org.junit.Test)

Example 5 with LoginFault

use of com.sforce.soap.partner.fault.LoginFault in project pentaho-kettle by pentaho.

the class SalesforceConnection method connect.

public void connect() throws KettleException {
    ConnectorConfig config = new ConnectorConfig();
    config.setAuthEndpoint(getURL());
    config.setServiceEndpoint(getURL());
    config.setUsername(getUsername());
    config.setPassword(getPassword());
    config.setCompression(isUsingCompression());
    config.setManualLogin(true);
    String proxyUrl = System.getProperty("http.proxyHost", null);
    if (StringUtils.isNotEmpty(proxyUrl)) {
        int proxyPort = Integer.parseInt(System.getProperty("http.proxyPort", "80"));
        String proxyUser = System.getProperty("http.proxyUser", null);
        String proxyPassword = Encr.decryptPasswordOptionallyEncrypted(System.getProperty("http.proxyPassword", null));
        config.setProxy(proxyUrl, proxyPort);
        config.setProxyUsername(proxyUser);
        config.setProxyPassword(proxyPassword);
    }
    // Set timeout
    if (getTimeOut() > 0) {
        if (log.isDebug()) {
            log.logDebug(BaseMessages.getString(PKG, "SalesforceInput.Log.SettingTimeout", "" + this.timeout));
        }
        config.setConnectionTimeout(getTimeOut());
        config.setReadTimeout(getTimeOut());
    }
    try {
        PartnerConnection pConnection = createBinding(config);
        if (log.isDetailed()) {
            log.logDetailed(BaseMessages.getString(PKG, "SalesforceInput.Log.LoginURL", config.getAuthEndpoint()));
        }
        if (isRollbackAllChangesOnError()) {
            // Set the SOAP header to rollback all changes
            // unless all records are processed successfully.
            pConnection.setAllOrNoneHeader(true);
        }
        // Attempt the login giving the user feedback
        if (log.isDetailed()) {
            log.logDetailed(BaseMessages.getString(PKG, "SalesforceInput.Log.LoginNow"));
            log.logDetailed("----------------------------------------->");
            log.logDetailed(BaseMessages.getString(PKG, "SalesforceInput.Log.LoginURL", getURL()));
            log.logDetailed(BaseMessages.getString(PKG, "SalesforceInput.Log.LoginUsername", getUsername()));
            if (getModule() != null) {
                log.logDetailed(BaseMessages.getString(PKG, "SalesforceInput.Log.LoginModule", getModule()));
            }
            log.logDetailed("<-----------------------------------------");
        }
        // Login
        this.loginResult = pConnection.login(config.getUsername(), Encr.decryptPasswordOptionallyEncrypted(config.getPassword()));
        if (log.isDebug()) {
            log.logDebug(BaseMessages.getString(PKG, "SalesforceInput.Log.SessionId") + " : " + this.loginResult.getSessionId());
            log.logDebug(BaseMessages.getString(PKG, "SalesforceInput.Log.NewServerURL") + " : " + this.loginResult.getServerUrl());
        }
        // Create a new session header object and set the session id to that
        // returned by the login
        pConnection.setSessionHeader(loginResult.getSessionId());
        config.setServiceEndpoint(loginResult.getServerUrl());
        // Return the user Infos
        this.userInfo = pConnection.getUserInfo();
        if (log.isDebug()) {
            log.logDebug(BaseMessages.getString(PKG, "SalesforceInput.Log.UserInfos") + " : " + this.userInfo.getUserFullName());
            log.logDebug("----------------------------------------->");
            log.logDebug(BaseMessages.getString(PKG, "SalesforceInput.Log.UserName") + " : " + this.userInfo.getUserFullName());
            log.logDebug(BaseMessages.getString(PKG, "SalesforceInput.Log.UserEmail") + " : " + this.userInfo.getUserEmail());
            log.logDebug(BaseMessages.getString(PKG, "SalesforceInput.Log.UserLanguage") + " : " + this.userInfo.getUserLanguage());
            log.logDebug(BaseMessages.getString(PKG, "SalesforceInput.Log.UserOrganization") + " : " + this.userInfo.getOrganizationName());
            log.logDebug("<-----------------------------------------");
        }
        this.serverTimestamp = pConnection.getServerTimestamp().getTimestamp().getTime();
        if (log.isDebug()) {
            BaseMessages.getString(PKG, "SalesforceInput.Log.ServerTimestamp", getServerTimestamp());
        }
        if (log.isDetailed()) {
            log.logDetailed(BaseMessages.getString(PKG, "SalesforceInput.Log.Connected"));
        }
    } catch (LoginFault ex) {
        // The LoginFault derives from AxisFault
        ExceptionCode exCode = ex.getExceptionCode();
        if (exCode == ExceptionCode.FUNCTIONALITY_NOT_ENABLED || exCode == ExceptionCode.INVALID_CLIENT || exCode == ExceptionCode.INVALID_LOGIN || exCode == ExceptionCode.LOGIN_DURING_RESTRICTED_DOMAIN || exCode == ExceptionCode.LOGIN_DURING_RESTRICTED_TIME || exCode == ExceptionCode.ORG_LOCKED || exCode == ExceptionCode.PASSWORD_LOCKOUT || exCode == ExceptionCode.SERVER_UNAVAILABLE || exCode == ExceptionCode.TRIAL_EXPIRED || exCode == ExceptionCode.UNSUPPORTED_CLIENT) {
            throw new KettleException(BaseMessages.getString(PKG, "SalesforceInput.Error.InvalidUsernameOrPassword"));
        }
        throw new KettleException(BaseMessages.getString(PKG, "SalesforceInput.Error.Connection"), ex);
    } catch (Exception e) {
        throw new KettleException(BaseMessages.getString(PKG, "SalesforceInput.Error.Connection"), e);
    }
}
Also used : KettleException(org.pentaho.di.core.exception.KettleException) ConnectorConfig(com.sforce.ws.ConnectorConfig) PartnerConnection(com.sforce.soap.partner.PartnerConnection) LoginFault(com.sforce.soap.partner.fault.LoginFault) ExceptionCode(com.sforce.soap.partner.fault.ExceptionCode) SOAPException(javax.xml.soap.SOAPException) KettleException(org.pentaho.di.core.exception.KettleException) ConnectionException(com.sforce.ws.ConnectionException) IOException(java.io.IOException)

Aggregations

LoginFault (com.sforce.soap.partner.fault.LoginFault)5 Test (org.junit.Test)4 PartnerConnection (com.sforce.soap.partner.PartnerConnection)3 File (java.io.File)3 IOException (java.io.IOException)3 TSalesforceInputProperties (org.talend.components.salesforce.tsalesforceinput.TSalesforceInputProperties)3 ConnectionException (com.sforce.ws.ConnectionException)2 ConnectorConfig (com.sforce.ws.ConnectorConfig)2 IndexedRecord (org.apache.avro.generic.IndexedRecord)2 Ignore (org.junit.Ignore)2 ExceptionCode (com.sforce.soap.partner.fault.ExceptionCode)1 ArrayList (java.util.ArrayList)1 SOAPException (javax.xml.soap.SOAPException)1 KettleException (org.pentaho.di.core.exception.KettleException)1 DefaultComponentRuntimeContainerImpl (org.talend.components.api.container.DefaultComponentRuntimeContainerImpl)1 RuntimeContainer (org.talend.components.api.container.RuntimeContainer)1 ComponentProperties (org.talend.components.api.properties.ComponentProperties)1 SalesforceConnectionProperties (org.talend.components.salesforce.SalesforceConnectionProperties)1 TSalesforceOutputProperties (org.talend.components.salesforce.tsalesforceoutput.TSalesforceOutputProperties)1 Form (org.talend.daikon.properties.presentation.Form)1