Ftp.dll | Blog | Limilabs https://www.limilabs.com/blog Thu, 07 May 2020 14:10:41 +0000 en-US hourly 1 https://wordpress.org/?v=6.3.4 FTP TLS encrypted data connections fail (EMS) https://www.limilabs.com/blog/ftp-tls-encrypted-data-connections-fail-ems Wed, 16 Oct 2019 13:07:35 +0000 https://www.limilabs.com/blog/?p=5545 Problem After the installation of the October 8, 2019 — KB4517389 or KB4520003 or KB4519998 or KB4519990 update (depending on OS version), all TLS encrypted data connections to the affected FTP servers fail. Error you may see is: “TLS session of data connection has not resumed or the session does not match the control connection” […]

The post FTP TLS encrypted data connections fail (EMS) first appeared on Blog | Limilabs.

]]>
Problem

After the installation of the October 8, 2019 — KB4517389 or KB4520003 or KB4519998 or KB4519990 update (depending on OS version), all TLS encrypted data connections to the affected FTP servers fail.

Error you may see is: “TLS session of data connection has not resumed or the session does not match the control connection”

Detailed explanation

In FTP protocol, data connection does not directly authenticate the client.

Client uses control connection to authenticate, then it established data connection using PASV command followed by the STOR (upload) or RETR (download) command.

The server opens a port and waits for the client to connect to it and upload/download files.

An attacker could figure out the port the server listens to, connect to it before the client, and upload a piece of malware.

TLS session resumption prevents this. It acts as a form of authentication. If the TLS session of the data connection matches the session of the control connection, both the client and the server have the guarantee, that the data connection is genuine. Any mismatch in sessions indicates a potential attack.

Ftp.dll library uses .NET’s SslStream that relies on Schannel (Microsoft Secure Channel – a security package that facilitates the use of Secure Sockets Layer (SSL) and/or Transport Layer Security (TLS))

Cause

The KB4517389 addresses the following issue:

“Addresses an issue in security bulletin CVE-2019-1318 that may cause client or server computers that don’t support Extended Master Secret (EMS) RFC 7627 to have increased connection latency and CPU utilization. This issue occurs while performing full Transport Layer Security (TLS) handshakes from devices that don’t support EMS, especially on servers. EMS support has been available for all the supported versions of Windows since calendar year 2015 and is being incrementally enforced by the installation of the October 8, 2019 and later monthly updates.”

It looks like Schannel stared enforcing EMS. If the server runs a TLS stack which is not compatible with this change, the FTP data connection fails.

OpenSSL, which is used by most servers, supports EMS since version 1.1.0 (released 25th August 2016).

Affected Servers

  • All FTP servers using OpenSSL older than version 1.1.0
  • FileZilla Server (all versions). The latest version uses an insecure/outdated OpenSSL version 1.0.2.11 from 2017.

Solution

Contact the server administrator, explain the situation and and request an upgrade of the FTP server software and of the installed OpenSSL version.

As a temporary workaround, the KB4517389 (or equivalent for non-Windows 10 machines) can be uninstalled.

As a temporary workaround on FileZilla server you can go to “FileZilla Server Interface/Edit/Settings/Ftp over TLS setting” and uncheck “Require TLS resumption on data connection when using FTP over TLS”:

The post FTP TLS encrypted data connections fail (EMS) first appeared on Blog | Limilabs.

]]>
System.Security.Authentication.AuthenticationException https://www.limilabs.com/blog/system-security-authentication-authenticationexception Fri, 02 Dec 2016 19:02:43 +0000 https://www.limilabs.com/blog/?p=5148 .NET uses SChannel.dll as underlying SSL/TLS implementation. SChannel is OS dependent and if incorrectly configured or configured to use only the latest TLS/SSL versions, may lead to problems with TLS/SSL negotiation. Please note that protocols that were considered secure some time ago, like SSL 3.0, are no longer considered secure. New OS updates may disable […]

The post System.Security.Authentication.AuthenticationException first appeared on Blog | Limilabs.

]]>
.NET uses SChannel.dll as underlying SSL/TLS implementation. SChannel is OS dependent and if incorrectly configured or configured to use only the latest TLS/SSL versions, may lead to problems with TLS/SSL negotiation.

Please note that protocols that were considered secure some time ago, like SSL 3.0, are no longer considered secure. New OS updates may disable some protocols or cipher versions. On Windows this is done via registry settings.

SSL version status

  • SSL 2.0 was deprecated (prohibited) in 2011 by RFC 6176.
  • SSL 3.0 was deprecated by RFC 7568 in June 2015.
    As of 2014 the 3.0 version of SSL is considered insecure as it is vulnerable to the POODLE attack that affects all block ciphers in SSL; and RC4, the only non-block cipher supported by SSL 3.0, is also feasibly broken as used in SSL 3.0.
  • The use of RC4 in TLS is prohibited by RFC 7465 published in February 2015.
  • The token supplied to the function is invalid

    Full exception looks like this:

    System.Security.Authentication.AuthenticationException :
    A call to SSPI failed, see inner exception.
    ----> System.ComponentModel.Win32Exception :
    The token supplied to the function is invalid

    Most likely your client tries to use TLS 1.2 but you are using old certificate on the server (e.g. signed using md5RSA algorithm).

    There are 2 options for you:

    1. Regenerate the certificate (especially if it’s self-signed).
    2. Use older TLS/SSL version (TLS 1.1, TLS 1.0, SSL 3.0). You can force Mail.dll or Ftp.dll to use it using following code:

      using (XXX client = new XXX())
      {
          client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls11;
          //client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls; // TLS 1.0
          //client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Ssl3;
      
          client.ConnectSSL("host");
      
          client.Close();
      }
      
      

      Please contact your server administrator as TLS 1.1, TLS 1.0 and SSL 3.0 aren’t considered secure anymore.

    The client and server cannot communicate, because they do not possess a common algorithm

    Full exception looks like this:

    System.Security.Authentication.AuthenticationException :
    A call to SSPI failed, see inner exception.
    ----> System.ComponentModel.Win32Exception :
    The client and server cannot communicate, because they do not possess a common algorithm

    There are 2 possible scenarios:

    1. In most cases this means that the client is trying to use older SSL protocols like SSL 3.0, TLS 1.0 or TLS 1.1, but the remote server requires modern protocol – TLS 1.2.

      By default all our clients support TLS 1.2. Some older versions need to be told to use TLS 1.2, it is also a good practice to force TLS 1.2 only:

      using (XXX client = new XXX())
      {
          client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls12;
      
          client.ConnectSSL("host");
      
          client.Close();
      }
      
    2. Second option is the server is not supporting TLS 1.2 – you’ll need to use older protocol (TLS 1.1, TLS 1.0, SSL 3.0):
      using (XXX client = new XXX())
      {
          client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls11;
          // client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls; // TLS 1.0
          // client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Ssl3; 
      
          client.ConnectSSL("host");
      
          client.Close();
      }
      

      Please contact your server administrator as TLS 1.1, TLS 1.0 and SSL 3.0 aren’t considered secure anymore.

    The message received was unexpected or badly formatted

    Full exception looks like this:

    System.Security.Authentication.AuthenticationException :
    A call to SSPI failed, see inner exception.
    ----> System.ComponentModel.Win32Exception :
    The message received was unexpected or badly formatted

    This error generally means that something is incorrectly configured on your machine.

    What you should try:

    1. Try forcing the latest TLS version (TLS 1.2):
      using (XXX client = new XXX())
      {
          client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls12;
      
          client.ConnectSSL("host");
      
          client.Close();
      }
      
    2. Use older TLS/SSL version (TLS 1.1, TLS 1.0, SSL 3.0). You can force Mail.dll or Ftp.dll to use it using following code:

      using (XXX client = new XXX())
      {
          client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls11;
          //client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls; // TLS 1.0
          //client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Ssl3;
      
          client.ConnectSSL("host");
      
          client.Close();
      }
      
      

      Please contact your server administrator as TLS 1.1, TLS 1.0 and SSL 3.0 aren’t considered secure anymore.

    3. Finally you can download IISCrypto and review “Schannel” and “Cipher Suites” tabs.

      For example we have seen clients that have TLS 1.0 turned on, but have TLS_RSA_WITH_3DES_EDE_CBC_SHA cypher suite turned off. If server requires this cypher, you’ll get this error message.

      Selecting “Best Practices” and restarting, should solve the issue. You may need to select additional protocol suites depending on what your server requires

      Please note that using TLS 1.2 and forcing your server administrator to enable TLS 1.2 is the only correct and secure way to go.

    One or more of the parameters passed to the function was invalid

    Full exception looks like this:

    System.Security.Authentication.AuthenticationException:
    A call to SSPI failed, see inner exception.
    ----> System.ComponentModel.Win32Exception:
    One or more of the parameters passed to the function was invalid

    This error generally means that you are trying to use TLS/SSL protocol version that is not supported on your machine (most likely it was turned off, because it is no longer considered secure)

    What you should try:

    1. Try forcing the latest TLS version (TLS 1.2):
      using (XXX client = new XXX())
      {
          client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls12;
      
          client.ConnectSSL("host");
      
          client.Close();
      }
      
    2. Use older TLS/SSL version (TLS 1.1, TLS 1.0, SSL 3.0). You can force Mail.dll or Ftp.dll to use it using following code:

      using (XXX client = new XXX())
      {
          client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls11;
          //client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls; // TLS 1.0
          //client.SSLConfiguration.EnabledSslProtocols = SslProtocols.Ssl3;
      
          client.ConnectSSL("host");
      
          client.Close();
      }
      
    3. Try to disable strong crypto using code:

            const string DisableCachingName = @"TestSwitch.LocalAppContext.DisableCaching";
            const string DontEnableSchUseStrongCryptoName = @"Switch.System.Net.DontEnableSchUseStrongCrypto";
            AppContext.SetSwitch(DisableCachingName, true);
            AppContext.SetSwitch(DontEnableSchUseStrongCryptoName, true);
      

      -or- by using app.config file:

      <configuration>
          <runtime>
              <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=true"/>
          </runtime>
      </configuration>
      

      ref: https://msdn.microsoft.com/en-us/library/mt298998(v=vs.110).aspx

    4. Finally you can download IISCrypto and review “Schannel” and “Cipher Suites” tabs.

      Selecting “Best Practices” restarting, should solve the issue. You may need to select additional protocol suites depending on what your server requires

      Please note that using TLS 1.2 and forcing your server administrator to enable TLS 1.2 is the only correct and secure way to go.

      Please contact your server administrator as TLS 1.1, TLS 1.0 and SSL 3.0 aren’t considered secure anymore.

    The post System.Security.Authentication.AuthenticationException first appeared on Blog | Limilabs.

    ]]>
    Using FTP TLS 1.2 with FTP https://www.limilabs.com/blog/use-ftp-tls12-with-ftp-ftps Fri, 18 Nov 2016 10:23:10 +0000 https://www.limilabs.com/blog/?p=5120 By default most systems allow SSL 3.0, TLS 1.0, 1.2 and 1.2 to be used. TLS 1.2 is the most secure version of SSL/TLS protocols. It is easy to force the connection to use it. All you need to do is to set Ftp.SSLConfiguration.EnabledSslProtocols property to SslProtocols.Tls12: For explicit SSL/TLS, code is almost the same. […]

    The post Using FTP TLS 1.2 with FTP first appeared on Blog | Limilabs.

    ]]>
    By default most systems allow SSL 3.0, TLS 1.0, 1.2 and 1.2 to be used.

    TLS 1.2 is the most secure version of SSL/TLS protocols. It is easy to force the connection to use it. All you need to do is to set Ftp.SSLConfiguration.EnabledSslProtocols property to SslProtocols.Tls12:

    // C#
    
    using (Ftp ftp = new Ftp())
    {
        ftp.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls12;
    
        ftp.ConnectSSL("ftps.example.com");
    
        ftp.Login("user","password");
    
        ftp.ChangeFolder("uploads");
        ftp.Upload("report.txt", @"c:\report.txt");
    
    
        ftp.Close();
    }
    
    ' VB.NET
    
    Using ftp As New Ftp()
    	ftp.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls12
    
    	ftp.ConnectSSL("ftps.example.com")
    
    	ftp.Login("user", "password")
    
    	ftp.ChangeFolder("uploads")
    	ftp.Upload("report.txt", "c:\report.txt")
    
    
    	ftp.Close()
    End Using
    

    For explicit SSL/TLS, code is almost the same. You first connect to non-secure port (21) and secure the connection using Ftp.AuthTLS command:

    // C#
    
    using (Ftp ftp = new Ftp())
    {
        ftp.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls12;
    
        ftp.Connect("ftp.example.com");
        ftp.AuthTLS();
    
        ftp.Login("user","password");
    
        ftp.ChangeFolder("uploads");
        ftp.Upload("report.txt", @"c:\report.txt");
    
        ftp.Close();
    }
    
    ' VB.NET
    
    Using ftp As New Ftp()
    	ftp.SSLConfiguration.EnabledSslProtocols = SslProtocols.Tls12
    
    	ftp.Connect("ftp.example.com")
    	ftp.AuthTLS()
    
    	ftp.Login("user", "password")
    
    	ftp.ChangeFolder("uploads")
    	ftp.Upload("report.txt", "c:\report.txt")
    
    	ftp.Close()
    End Using
    

    To use TLS 1.2 .NET Framework 4.5+ must be installed on your machine and you application should target .NET 4.5+.

    It is possible to use TLS 1.2 in applications targeting .NET lower than 4.5, but 4.5 must be installed on the machine. After you have .NET 4.5 installed, your 2.0-4.0 apps will use the 4.5 System.dll and you can enable TLS 1.2 using this code:

        ftp.SSLConfiguration.EnabledSslProtocols = (System.Security.Authentication.SslProtocols)3072;
    

    The post Using FTP TLS 1.2 with FTP first appeared on Blog | Limilabs.

    ]]>
    Using Limilabs’ Ftp.dll with zOS Mainframes https://www.limilabs.com/blog/using-limilabs-ftp-dll-with-zos-mainframes Wed, 17 Dec 2014 09:47:42 +0000 http://www.limilabs.com/blog/?p=4828 I purchased the Limilabs FTP product for FTP because I needed to send data to and from an IBM mainframe from my VB.NET program running in Windows. In particular I needed to be able to submit jobs, and receive the job output. These notes show how it’s done. Introduction FTP to/from IBM computers is pretty […]

    The post Using Limilabs’ Ftp.dll with zOS Mainframes first appeared on Blog | Limilabs.

    ]]>
    I purchased the Limilabs FTP product for FTP because I needed to send data to and from an IBM mainframe from my VB.NET program running in Windows. In particular I needed to be able to submit jobs, and receive the job output. These notes show how it’s done.

    Introduction

    FTP to/from IBM computers is pretty much like any other FTP except for two things.
    1. IBM Mainframe and Midrange computers mostly use EBCDIC encoding rather than ASCII. With the FTP defaults your data can be garbled and useless when it arrives at the other end.
    2. The SITE command is used to submit jobs to the mainframe, and get the results back.

    Getting Started

    I created a class called “JazzFTP” to wrap the Limilabs’ code. This was going to contain the functions that I wanted for my project, and so I started by defining the common elements that all methods would use. In my situation every FTP would be authenticated, and would be exchanging text data (not binary) with the remote computer.

    Here is the initial class definition:

    Imports Limilabs.FTP.Client
    
    Public Class JazzFTP
        '   This class wraps the FTP library from Limilabs (/ftp)
        '   All methods
        '   1   Connect and logon using information from MySettings:  Sub LoginFTP
        '   2   Perform their action based on their parameters
        '   3   Close the connection
        Dim ftp As New Ftp()
        Dim response As FtpResponse
        Private Sub LoginFTP()
            ftp.Connect(My.Settings.SubmitIP)
            ftp.Login(My.Settings.Userid, My.Settings.Password)
        End Sub
        '   My functions will be written here
    End Class
    

    Basic FTP

    Here is my first method, a basic function to upload a text file: –

        Function Upload(DestinationFile As String, Uploadfile As String) As String 
            LoginFTP()
            ftp.TransfersDataType = FtpDataType.Ascii
            response = ftp.Upload(DestinationFile, Uploadfile)
            ftp.Close()
            Return response.message
        End Function
    

    FTP’s default is Binary, which is correct if you are transmitting a .JPG or other binary object, and it probably doesn’t matter if you are transmitting text to/from another Windows computer or a Unix computer. However if you are transmitting to/from an IBM mainframe or midrange computer it probably needs EBCDIC rather than ASCII characters. You must tell it that the file is Ascii text, not binary, otherwise it won’t be converted and it will be gibberish when you examine it on the mainframe.

    Although this code above works, it is very fragile: the FTP server has to be up and running, you have to get the connection details exactly right, the source and destination files must exist, and so on. Since I couldn’t guarantee all of these details, I enclosed the code in Try/Catch to deal with any errors. For the time being I’ve simply used MsgBox to display the error message.

        Function Upload(DestinationFile As String, Uploadfile As String) As String
            Try
                LoginFTP()
                ftp.TransfersDataType = FtpDataType.Ascii
                response = ftp.Upload(DestinationFile, Uploadfile)
                ftp.Close()
                Return response.EndLine
            Catch ex As Exception
                MsgBox(ex.Message)
                Return ex.Message
            End Try
        End Function
    

    Download, which is not illustrated, is similar except that you’d use ftp.Download. Again, you specify:

                ftp.TransfersDataType = FtpDataType.Ascii
    

    Submitting Jobs and Receiving Job Output

    Submitting a job is essentially an upload with a twist. Instead of uploading the file containing the job to a named file on the mainframe, you upload it to the JES (Job Entry System) input queue. Here is the basic code:

                response = ftp.Site("FILETYPE=JES")
                ftp.TransfersDataType = FtpDataType.Ascii
                response = ftp.Upload("JES", JCLFile)
    

    The first line uses “ftp.Site”. Site means that this is a site-specific command, something that the FTP system at the other end will presumably know about. For an IBM mainframe “FILETYPE=JES” means that the data is going to and from JES.

    The third line uploads the file in which we have prepared our job: in this case JCLFile is a file containing something like this: –

    //IBMUSERH JOB  ,CLASS=A,MSGCLASS=H,NOTIFY=&SYSUID,COND=(8,LT) 
    //*** COPY SOURCE INTO SOURCE LIBRARY
    //COPY EXEC PGM=IEBGENER
    //SYSPRINT DD SYSOUT=*
    //SYSIN DD DUMMY
    //SYSUT2 DD DSN=IBMUSER.MANAJAZZ.SRCLIB(CRDTA1),DISP=SHR
    //SYSUT1 DD *
    

    Like any upload the FTP client syntax requires a destination file name, but because of the preceding FILETYPE=JES this will be ignored. I have written “JES” purely for documentation.

    This will submit the job and it will run, appearing in the output like this:

    tasks

    Of course we can view the job output on the mainframe, but we may want to return it to Windows. We do this by downloading the file by naming the JobID – JOB00594 in this case – and again using the Site command. The essential code is: –

            response = ftp.Site("FILETYPE=JES")
            ftp.TransfersDataType = FtpDataType.Ascii
            ftp.Download(Jobname, LocalPath)
    

    But how do we get the Jobname? JES returns a message with this information when the job is submitted. We need to add code to the Job Submission logic to extract this from the message. In function JobSub

           response = ftp.Upload("JES", JCLFile)
    

    upload the job and (if all goes well) returns a message like
    “It is known to JES as JOB00594″
    This code extracts JOB00594” and puts it into variable JobName

           Dim TestString As String = "It is known to JES as"
           If Mid(response.Message, 1, Len(TestString)) = TestString Then  'Should be true
               Jobname = Trim(Mid(response.Message, Len(TestString) + 1))
           End If
    

    Now, since it is logical that if we submit a job we’ll want to get it back, I coded this in the JobSub function: –

        Function JobSub(JCLFile As String, ByRef Jobname As String) As FtpResponse
            '   JCLFile is path to a .JCL file (format .txt) containing the job to be submitted
            '   If successful submission, the job name is returned in JobName
            Dim Tstring As String = ""
            Try
                Jobname = "Unknown"
                LoginFTP()
                response = ftp.Site("FILETYPE=JES")
                ftp.TransfersDataType = FtpDataType.Ascii
                response = ftp.Upload("JES", JCLFile)
                Dim TestString As String = "It is known to JES as"
                If Mid(response.Message, 1, Len(TestString)) = TestString Then  'Should be true
                    Jobname = Trim(Mid(response.Message, Len(TestString) + 1))
                End If
                JobGet(Jobname, False)
                ftp.Close()
            Catch ex As Exception
                MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Jazz FTP")
                Return response
            End Try
            Return response
        End Function
    

    and I coded JobGet to accept these parameters: –

        Function JobGet(Jobname As String, Optional Login As Boolean = True) As FtpResponse
            '   Get job output, save as Jobname.txt in Jazz Program Library.  
            If Login Then
                LoginFTP()
            End If
            response = ftp.Site("FILETYPE=JES")
            ftp.TransfersDataType = FtpDataType.Ascii
            Dim LocalPath As String = My.Settings.UserCommonPath & "\" & My.Settings.Programs & "\" & Jobname & ".txt"
            Jazzworkbench.ShowBtnResults(Jobname, Jazzworkbench.ResultsStatus.Pending)
            ftp.Download(Jobname, LocalPath)
            ftp.DeleteFile(Jobname)
            Jazzworkbench.ShowBtnResults(Jobname, Jazzworkbench.ResultsStatus.JobReturned)
            ftp.Close()
            Return response
        End Function
    

    Once the job output has been downloaded I didn’t want to leave it cluttering up my Held Job Output Queue, so after the Download

            ftp.DeleteFile(Jobname)
    

    gets rid of it.

    This all works for my test jobs (which are very quick) and provided that mainframe FTP server is available.

    If you want to know any more about my project to revolutionize mainframe programming, then have a look at www.jazzsoftware.co.nz

    Best wishes with your programming,
    Robert Barnes.

    The post Using Limilabs’ Ftp.dll with zOS Mainframes first appeared on Blog | Limilabs.

    ]]>
    Unblock .dll file https://www.limilabs.com/blog/unblock-dll-file Wed, 31 Oct 2012 10:44:32 +0000 http://www.limilabs.com/blog/?p=3543 Symptoms You can not add .dll file as a reference in Visual Studio or SecurityException is thrown. Solution Most likely the problem is a protection on files coming from other computers. You just have to open file properties and click on Unblock button. Unblock the zip file first, and then extract the dll, unblock the […]

    The post Unblock .dll file first appeared on Blog | Limilabs.

    ]]>
    Symptoms

    You can not add .dll file as a reference in Visual Studio or SecurityException is thrown.

    Solution

    Most likely the problem is a protection on files coming from other computers. You just have to open file properties and click on Unblock button. Unblock the zip file first, and then extract the dll, unblock the dll if needed:

    Other tricks is to copy the file to a file system that doesn’t support alternate data streams, that slices them off the file. A flash drive for example.

    The post Unblock .dll file first appeared on Blog | Limilabs.

    ]]>
    .chm file is not displayed correctly https://www.limilabs.com/blog/chm-file-is-not-displayed-correctly Thu, 11 Oct 2012 10:40:10 +0000 http://www.limilabs.com/blog/?p=3506 Symptoms When you open a .chm file, “Navigation to the webpage was canceled” is displayed in the reading pane. Solution Most likely the problem is a protection on files coming from other computers. You just have to open file properties and click on Unblock button:

    The post .chm file is not displayed correctly first appeared on Blog | Limilabs.

    ]]>
    Symptoms

    When you open a .chm file, “Navigation to the webpage was canceled” is displayed in the reading pane.

    Solution

    Most likely the problem is a protection on files coming from other computers. You just have to open file properties and click on Unblock button:

    The post .chm file is not displayed correctly first appeared on Blog | Limilabs.

    ]]>
    FTP file and folder permissions https://www.limilabs.com/blog/ftp-file-and-folder-permissions Tue, 14 Aug 2012 08:15:07 +0000 http://www.limilabs.com/blog/?p=3295 You can access remote file or folder permissions using Limilabs .NET FTP library. First you should learn how to connect and download files from FTP server. It is important to realize that originally FTP protocol didn’t have the concept of file/folder permissions build-in directly. LIST command, that allowed listing contents of the remote server, was […]

    The post FTP file and folder permissions first appeared on Blog | Limilabs.

    ]]>
    You can access remote file or folder permissions using Limilabs .NET FTP library. First you should learn how to connect and download files from FTP server.

    It is important to realize that originally FTP protocol didn’t have the concept of file/folder permissions build-in directly.

    LIST command, that allowed listing contents of the remote server, was build around system listing commands: ls on UNIX/LINUX machines, dir on Windows.
    ls returns file permissions divided into 3 groups: Owning user, owning group and others e.g.: rwxr–rw-.

    When using Ftp.dll Ftp.List and Ftp.GetList methods with UNIX FTP server (or a server that imitates ls output for LIST command) you can access these UNIX permissions using UnixPermissions property on FtpItem object:

    // C#
    
    List<FtpItem> items = client.List();
    UnixPermissionSet set = items[0].UnixPermissions;
    
    bool ownerCanRead = (set.OwnerUser | UnixPermission.Read) != 0;
    bool groupCanRead = (set.OwnerGroup | UnixPermission.Read) != 0;
    bool othersCanRead = (set.Others | UnixPermission.Read) != 0;
    
    bool ownerCanWrite = (set.OwnerUser | UnixPermission.Write) != 0;
    
    
    ' VB.NET
    
    Dim items As List(Of FtpItem) = client.List()
    Dim [set] As UnixPermissionSet = items(0).UnixPermissions
    
    Dim ownerCanRead As Boolean = ([set].OwnerUser Or UnixPermission.Read) <> 0
    Dim groupCanRead As Boolean = ([set].OwnerGroup Or UnixPermission.Read) <> 0
    Dim othersCanRead As Boolean = ([set].Others Or UnixPermission.Read) <> 0
    
    Dim ownerCanWrite As Boolean = ([set].OwnerUser Or UnixPermission.Write) <> 0
    

    MLSD and perm fact

    As FTP protocol evolved, MLSD command was introduced with RFC 3659.

    MLSD standardized the way listings are returned from the server. It introduced facts concept, and in particular perm fact.
    Ftp.GetList method uses MLSD command if it is available, that is if MLST extension is supported and advertised by the remote server. It is possible to force this command to be used by calling Ftp.MLSD method directly.

    You can access parsed version of perm fact using FtpItem.Permission property:

    // C#
    
    List<FtpItem> items = client.GetList();
    List<FtpPermission> permissions = items[0].Permissions;
    
    bool canRead = permissions.Contains(FtpPermission.Read);
    bool canWrite = permissions.Contains(FtpPermission.Write);
    bool canCreateFile = permissions.Contains(FtpPermission.CreateFile);
    bool canChangeFolder = permissions.Contains(FtpPermission.ChangeFolder);
    
    
    ' VB.NET
    
    Dim items As List(Of FtpItem) = client.GetList()
    Dim permissions As List(Of FtpPermission) = items(0).Permissions
    
    Dim canRead As Boolean = permissions.Contains(FtpPermission.Read)
    Dim canWrite As Boolean = permissions.Contains(FtpPermission.Write)
    Dim canCreateFile As Boolean = permissions.Contains(FtpPermission.CreateFile)
    Dim canChangeFolder As Boolean = permissions.Contains(FtpPermission.ChangeFolder)
    

    As you can see Ftp permissions can contain additional information such as if you can select particular folder or create a file within.

    Changing the permissions

    There is no standardized way of changing the permissions. You’ll need SITE command (this command is used by the server to provide services specific to his system but not sufficiently universal to be included as commands in protocol) and CHMOD (again UNIX command).

    Limilabs .NET FTP library contains useful shortcut for that – SiteChangeMode method:

    // C#
    
    client.SiteChangeMode("file.txt", new UnixPermissionSet(UnixPermission.Write));
    
    ' VB.NET
    
    client.SiteChangeMode("file.txt", New UnixPermissionSet(UnixPermission.Write))
    

    Note that the same UnixPermissionSet class can is used that is returned by FtpItem.UnixPermissions property

    The post FTP file and folder permissions first appeared on Blog | Limilabs.

    ]]>
    FTP uploading files using patterns https://www.limilabs.com/blog/ftp-uploading-files-using-patterns https://www.limilabs.com/blog/ftp-uploading-files-using-patterns#comments Tue, 26 Jun 2012 10:07:12 +0000 http://www.limilabs.com/blog/?p=3192 Uploading files using patters is a unique feature of our FTP component. It allows you fast upload of files of certain types. Here’s the sample that uploads all text files (*.txt) files from C drive, to newly created ‘Uploads’ folder on FTP server. The search includes all child folders recursively – note the true parameter […]

    The post FTP uploading files using patterns first appeared on Blog | Limilabs.

    ]]>
    Uploading files using patters is a unique feature of our FTP component. It allows you fast upload of files of certain types.

    Here’s the sample that uploads all text files (*.txt) files from C drive, to newly created ‘Uploads’ folder on FTP server. The search includes all child folders recursively – note the true parameter in LocalSearchOptions constructor. Ftp component is going to create all necessary folders on the remote FTP server for you.

    Upload using wildcard pattern

    // C#
    
    using (Ftp ftp = new Ftp())
    {
        ftp.Connect("ftp.example.com");    // or ConnectSSL
    
        ftp.CreateFolder("Uploads");
    
        LocalSearchOptions options = new LocalSearchOptions("*.txt", true);
        ftp.UploadFiles("Uploads", @"c:\", options);
    
        ftp.Close();
    }
    
    ' VB.NET
    
    Using ftp As New Ftp()
        ftp.Connect("ftp.example.com")	' or ConnectSSL
        ftp.CreateFolder("Uploads")
    
        Dim options As New LocalSearchOptions("*.txt", True)
        ftp.UploadFiles("Uploads", "c:\", options)
    
        ftp.Close()
    End Using
    

    Upload using regex pattern

    You can also use LocalSearchOptions.UseRegexMatch method, if you want to use regex patterns:

    // C#
    
    using (Ftp ftp = new Ftp())
    {
        ftp.Connect("ftp.example.com");    // or ConnectSSL
    
        ftp.CreateFolder("Uploads");
    
        LocalSearchOptions options = new LocalSearchOptions();
        options.UseRegexMatch(@"^.*$", @"^.*\.txt$", true);
        ftp.UploadFiles("Uploads", @"c:\", options);
    
        ftp.Close();
    }
    
    ' VB.NET
    
    Using ftp As New Ftp()
        ftp.Connect("ftp.example.com")	' or ConnectSSL
    
        ftp.CreateFolder("Uploads")
    
        Dim options As New LocalSearchOptions()
        options.UseRegexMatch("^.*$", "^.*\.txt$", True)
        ftp.UploadFiles("Uploads", "c:\", options)
    
        ftp.Close()
    End Using
    

    The post FTP uploading files using patterns first appeared on Blog | Limilabs.

    ]]>
    https://www.limilabs.com/blog/ftp-uploading-files-using-patterns/feed 4
    FTP downloading files using patterns https://www.limilabs.com/blog/ftp-downloading-files-using-patterns https://www.limilabs.com/blog/ftp-downloading-files-using-patterns#comments Tue, 26 Jun 2012 10:07:08 +0000 http://www.limilabs.com/blog/?p=3191 Downloading files using patters is a unique feature of our FTP .NET component. It allows you fast download of files of certain types. Here’s the sample that download all text files (*.txt) files from remote Uploads folder to Downloads folder located on C drive. Remote search includes all child folders recursively – note the true […]

    The post FTP downloading files using patterns first appeared on Blog | Limilabs.

    ]]>
    Downloading files using patters is a unique feature of our FTP .NET component. It allows you fast download of files of certain types.

    Here’s the sample that download all text files (*.txt) files from remote Uploads folder to Downloads folder located on C drive. Remote search includes all child folders recursively – note the true parameter in RemoteSearchOptions constructor. Ftp component is going to create all necessary folders on the local computer.

    Download using wildcard pattern

    // C#
    
    using (Ftp ftp = new Ftp())
    {
        ftp.Connect("ftp.example.com");    // or ConnectSSL
        
        Directory.CreateDirectory(@"c:\Downloads");
    
        RemoteSearchOptions options = new RemoteSearchOptions("*.txt", true);
        ftp.DownloadFiles("Uploads", @"c:\Downloads", options);
    
        ftp.Close();
    }
    
    ' VB.NET
    
    Using ftp As New Ftp()
        ftp.Connect("ftp.example.com")    ' or ConnectSSL
    
        Directory.CreateDirectory("c:\Downloads")
        
        Dim options As RemoteSearchOptions = _
            New RemoteSearchOptions("*.txt", True)
        ftp.DownloadFiles("Uploads", "c:\Downloads", options)
    
        ftp.Close()
    End Using
    

    Download using regex pattern

    You can also use RemoteSearchOptions.UseRegexMatch method, if you want to use regex patterns on remote names:

    // C#
    
    using (Ftp ftp = new Ftp())
    {
        ftp.Connect("ftp.example.com");    // or ConnectSSL
        
        Directory.CreateDirectory(@"c:\Downloads");
    
        RemoteSearchOptions options = new RemoteSearchOptions();
        options.UseRegexMatch(@"^.*$", @"^.*\.txt$", true);
        ftp.DownloadFiles("Uploads", @"c:\Downloads", options);
    
        ftp.Close();
    }
    
    ' VB.NET
    
    Using ftp As New Ftp()
        ftp.Connect("ftp.example.com")	' or ConnectSSL
    
        Directory.CreateDirectory("c:\Downloads")
    
        Dim options As RemoteSearchOptions = _
            New RemoteSearchOptions()
        options.UseRegexMatch("^.*$", "^.*\.txt$", True)
        ftp.DownloadFiles("Uploads", "c:\Downloads", options)
    
        ftp.Close()
    End Using
    

    The post FTP downloading files using patterns first appeared on Blog | Limilabs.

    ]]>
    https://www.limilabs.com/blog/ftp-downloading-files-using-patterns/feed 2
    Ftp zlib compression https://www.limilabs.com/blog/ftp-zlib-compression Tue, 19 Jun 2012 17:50:57 +0000 http://www.limilabs.com/blog/?p=3184 Ftp.dll FTP component supports zlib compression for all data transfers. What is zlib zlib is a compression method which can greatly decrease the size of data, similar to popular compression format – Zip. How to use zlib zlib can be used with Ftp.dll FTP/FTPS component thanks to the newly implemented MODE Z command. This command […]

    The post Ftp zlib compression first appeared on Blog | Limilabs.

    ]]>
    Ftp.dll FTP component supports zlib compression for all data transfers.

    What is zlib

    zlib is a compression method which can greatly decrease the size of data, similar to popular compression format – Zip.

    How to use zlib

    zlib can be used with Ftp.dll FTP/FTPS component thanks to the newly implemented MODE Z command. This command and format have been already adopted by popular FTP servers.

    Ftp.dll automatically turns compression on, if it is supported by FTP server. zlib compression is transparent to users. It is activeted using MODE Z command. Once sent, client sends and receives compressed data, so all directory listings and file exchanges between server and client will be compressed.

    What is the benefit?

    Faster data transfers! Directory listing, which is text, can be highly compressed with zlib thus boosting the server and client network speed and reactivity.

    Transfers of html, scripts or large logfiles (which are text) no longer needs to be zipped before being sent via ftp and should generally experience a 3-4 times gain in data transfers.

    For example, a 60MB log file can turn into a 5MB data exchange when transferred with MODE Z enabled.

    Depending on the file content, you will see different results:

    • Text files : ~15-20% of original size.
    • Html files : ~25-30% of original size.
    • Media, video, sound : ~90-95% of original size.
    • Already compressed documents with Zip, Rar, Ace etc. will see almost no gain at all.

    The post Ftp zlib compression first appeared on Blog | Limilabs.

    ]]>