Worked with the WRC and we identified the following configurations/changes were required to resolve this issue:

  1. Specify the SSLConfig setting in Ensemble
    1.  Had to include a * in the setting for legacy FTPS (otherwise it would not connect at all)
  1. Ensemble does not support session resumption (if required by the vendor hosting the server). 
    1. Reached out to vendor for them to disable it.
    2. Additionally there were two FTP commands that needed to be sent PBSZ 0 (Protection Buffer Size) and PROT P (Protection Data Channel).  These need to be run after the connection is made but before the write/save of the file on the server.

                                do ..Adapter.Connect()

                                do ..Adapter.FTP.sendCommand("PBSZ 0")
                                do ..Adapter.FTP.sendCommand("PROT P")

 

Thanks

Hey Eduard,

Thanks so much for the quick response! 

#1.  It looks like creating a new App.FTP.InboundAdapter class extending the EnsLib version and removing the adapter settings in there worked.  I also removed those property/SETTINGS from my App.FTP.InboundService Class as mentioned.

#2.  $classname(..Adapter.FTP) was returning the FTPInboundAdapter but using ..Adapter.FTP.%sftpSession.MkDir() did work.

Thanks!

Thanks for the great article.  I have a few questions/issues and would appreciate some help.

1.  I'm trying to remove the DeleteFromServer and ArchivePath properties but they still appear in the Production even though I've added the - to the Parameter SETTINGS.

Parameter SETTINGS = "-DeleteFromServer, -ArchivePath, RemoteArchive, TargetConfigNames";

2.  For the Remote Archive, I can get the rename to work but that assumes the archive path exists.  I wanted to do some checking to see if the path exists (if not create) but can't seem to get the method calls right.  Am I reading the documentation incorrectly since I thought doing ..Adapter.FTP then references the FTP session object (%Net.FtpSession, or for SFTP %Net.SSH.SFTP) then method MakeDirectory or MkDir would be accessible.  So my call looks like ..Adapter.FTP.MakeDirectory(.RemoteArchivePath) but it errors with METHOD DOES NOT EXIST. 

Hi Eduard,

Thanks for the response, yes you mentioned this in a similar thread: https://community.intersystems.com/post/set-value-propertys-displaylist-valuelist but I could not get it to work until now. 

I've modified my code as follows:This is the new class:

Class JMH.EnsSearchUtils Extends Ens.ContextSearch
{
ClassMethod GetKeyLookup(Output pCaption As %String, Output pTopResults, Output pResults, ByRef pParms As %String, pSearchKey As %String = "") As %Status
{
set tStatus = $$$OK
    kill pResults, pTopResults
set pCaption = ""
set tStatement = ##class(%SQL.Statement).%New()
set strSQL="SELECT DataValue FROM Ens_Util.LookupTable WHERE TableName = 'KeyLUT' order by DataValue"
    set tStatus = tStatement.%Prepare(strSQL)
if tStatus '= 1 Quit $$$ERROR($$$GeneralError, "No SQL Tables found")
     set rset = tStatement.%Execute()
while rset.%Next(.tStatus) {
set pResults($i(pResults)) = rset.%Get("DataValue")
}
quit tStatus
}
}

In the Business Operation.

1.  Still declare the property like so 'Property KeyLookup; '

2.  In the Parameter SETTINGS:  "KeyLookup:Additional:selector?context={JMH.EnsSearchUtils/GetKeyLookup}";

To break this down:

KeyLookup is the property name 

Additional is the Additional Settings Category area of the Business Operation where this property will be displayed in the Portal

The rest is used to call the ContextSearch class and method to return the result values for the property.