Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: [FTPd] [Windows Server] Multiple address / ports bindings #1767

Open
2 tasks done
pollier opened this issue Sep 27, 2024 · 1 comment
Open
2 tasks done

[Bug]: [FTPd] [Windows Server] Multiple address / ports bindings #1767

pollier opened this issue Sep 27, 2024 · 1 comment
Labels
bug Something isn't working

Comments

@pollier
Copy link

pollier commented Sep 27, 2024

⚠️ This issue respects the following points: ⚠️

  • This is a bug, not a question or a configuration issue.
  • This issue is not already reported on Github (I've searched it).

Bug description

I'm trying to bind multiple 21 port on differents local address, the service crash on start.

I've double checked that nothing else is using that port.
Also tested on a fresh windows VM in Azure

From what i understand the problem come from ftpserverlib which is not handling properly a configuration where same port is bind on different ip address

Please find full logs and config attached with public ip address changed

sftpgo.json

Steps to reproduce

  1. Install SFTPGo on windows server 2022 using choco
  2. Edit config to bind same port on multiple IP address
  3. Restart the service
  4. Crash

Expected behavior

FTP server should bind each socket (ip + port) without conflict.

SFTPGo version

2.6.2-636a1c2c-2024-06-21T17:20:51Z

Data provider

sqlite

Installation method

Other

Configuration

No env vars

"ftpd": {
    "bindings": [
      {
        "address": "10.0.2.42",
        "force_passive_ip": "9.9.78.42",
        "port": 21
      },
      {
        "address": "10.0.2.41",
        "force_passive_ip": "9.9.78.41",
        "port": 9090
      },
      {
        "address": "10.0.2.40",
        "force_passive_ip": "9.9.78.40",
        "port": 21
      },
      {
        "address": "10.0.2.43",
        "force_passive_ip": "9.9.78.43",
        "port": 73
      }
    ],
    "combine_support": 1,
    "disable_active_mode": true,
    "enable_site": false,
    "hash_support": 1,
    "passive_port_range": {
      "end": 9900,
      "start": 9091
    }
  },

sftpgo.json

Relevant log output

{"level":"info","time":"2024-09-26T15:57:22.823","sender":"service","message":"starting SFTPGo 2.6.2-636a1c2c-2024-06-21T17:20:51Z +metrics +azblob +gcs +s3 +bolt +mysql +pgsql +sqlite -unixcrypt +portable, config dir: C:\\ProgramData\\SFTPGo, config file: , log max size: 10 log max backups: 5 log max age: 28 log level: debug, log compress: false, log utc time: false, load data from: \"\", grace time: 0 secs"}
{"level":"debug","time":"2024-09-26T15:57:22.828","sender":"config","message":"config file used: '\"C:\\\\ProgramData\\\\SFTPGo\\\\sftpgo.json\"', config loaded: {Common:{IdleTimeout:15 UploadMode:0 Actions:{ExecuteOn:[] ExecuteSync:[] Hook:} SetstatMode:0 RenameMode:0 ResumeMaxSize:0 TempPath: ProxyProtocol:0 ProxyAllowed:[] ProxySkipped:[] StartupHook: PostConnectHook: PostDisconnectHook: DataRetentionHook: MaxTotalConnections:0 MaxPerHostConnections:20 AllowListStatus:0 AllowSelfConnections:0 DefenderConfig:{Enabled:false Driver:memory BanTime:30 BanTimeIncrement:50 Threshold:15 ScoreInvalid:2 ScoreValid:1 ScoreLimitExceeded:3 ScoreNoAuth:0 ObservationTime:30 EntriesSoftLimit:100 EntriesHardLimit:150 LoginDelay:{Success:0 PasswordFailed:1000}} RateLimitersConfig:[{Average:0 Period:1000 Burst:1 Type:2 Protocols:[SSH FTP DAV HTTP] GenerateDefenderEvents:false EntriesSoftLimit:100 EntriesHardLimit:150}] Umask: ServerVersion: Metadata:{Read:0} idleTimeoutAsDuration:0 idleLoginTimeout:0 defender:<nil> allowList:<nil> rateLimitersList:<nil> proxyAllowed:[] proxySkipped:[]} ACME:{Email: KeyType:4096 CertsPath:certs CAEndpoint:https://acme-v02.api.letsencrypt.org/directory Domains:[] RenewDays:30 HTTP01Challenge:{Port:80 WebRoot: ProxyHeader:} TLSALPN01Challenge:{Port:0} accountConfigPath: accountKeyPath: lockPath: tempDir:} SFTPD:{Bindings:[{Address: Port:0 ApplyProxyConfig:true}] MaxAuthTries:0 HostKeys:[] HostCertificates:[] HostKeyAlgorithms:[] KexAlgorithms:[] MinDHGroupExchangeKeySize:2048 Ciphers:[] MACs:[] PublicKeyAlgorithms:[] TrustedUserCAKeys:[] RevokedUserCertsFile: LoginBannerFile: EnabledSSHCommands:[md5sum sha1sum sha256sum cd pwd scp] KeyboardInteractiveAuthentication:true KeyboardInteractiveHook: PasswordAuthentication:true certChecker:<nil> parsedUserCAKeys:[]} FTPD:{Bindings:[{Address:10.0.2.42 Port:21 ApplyProxyConfig:true TLSMode:0 TLSSessionReuse:0 CertificateFile: CertificateKeyFile: MinTLSVersion:12 ForcePassiveIP:9.9.78.42 PassiveIPOverrides:[] PassiveHost: ClientAuthType:0 TLSCipherSuites:[] PassiveConnectionsSecurity:0 ActiveConnectionsSecurity:0 IgnoreASCIITransferType:0 Debug:false ciphers:[]} {Address:10.0.2.41 Port:9090 ApplyProxyConfig:false TLSMode:0 TLSSessionReuse:0 CertificateFile: CertificateKeyFile: MinTLSVersion:0 ForcePassiveIP:9.9.78.41 PassiveIPOverrides:[] PassiveHost: ClientAuthType:0 TLSCipherSuites:[] PassiveConnectionsSecurity:0 ActiveConnectionsSecurity:0 IgnoreASCIITransferType:0 Debug:false ciphers:[]} {Address:10.0.2.40 Port:21 ApplyProxyConfig:false TLSMode:0 TLSSessionReuse:0 CertificateFile: CertificateKeyFile: MinTLSVersion:0 ForcePassiveIP:9.9.78.40 PassiveIPOverrides:[] PassiveHost: ClientAuthType:0 TLSCipherSuites:[] PassiveConnectionsSecurity:0 ActiveConnectionsSecurity:0 IgnoreASCIITransferType:0 Debug:false ciphers:[]} {Address:10.0.2.43 Port:73 ApplyProxyConfig:false TLSMode:0 TLSSessionReuse:0 CertificateFile: CertificateKeyFile: MinTLSVersion:0 ForcePassiveIP:9.9.78.43 PassiveIPOverrides:[] PassiveHost: ClientAuthType:0 TLSCipherSuites:[] PassiveConnectionsSecurity:0 ActiveConnectionsSecurity:0 IgnoreASCIITransferType:0 Debug:false ciphers:[]}] BannerFile: CertificateFile: CertificateKeyFile: CACertificates:[] CARevocationLists:[] ActiveTransfersPortNon20:true DisableActiveMode:true EnableSite:false HASHSupport:1 CombineSupport:1 PassivePortRange:{Start:9091 End:9900} acmeDomain:} WebDAVD:{Bindings:[{Address: Port:0 EnableHTTPS:false CertificateFile: CertificateKeyFile: MinTLSVersion:12 ClientAuthType:0 TLSCipherSuites:[] Protocols:[] Prefix: ProxyAllowed:[] ClientIPProxyHeader: ClientIPHeaderDepth:0 DisableWWWAuthHeader:false allowHeadersFrom:[]}] CertificateFile: CertificateKeyFile: CACertificates:[] CARevocationLists:[] Cors:{AllowedOrigins:[] AllowedMethods:[] AllowedHeaders:[] ExposedHeaders:[] AllowCredentials:false Enabled:false MaxAge:0 OptionsPassthrough:false OptionsSuccessStatus:0 AllowPrivateNetwork:false} Cache:{Users:{ExpirationTime:0 MaxSize:50} MimeTypes:{Enabled:true MaxSize:1000 CustomMappings:[]}} acmeDomain:} ProviderConf:{Driver:sqlite Name:sftpgo.db Host: Port:0 Username: Password: SSLMode:0 DisableSNI:false TargetSessionAttrs: RootCert: ClientCert: ClientKey: ConnectionString: SQLTablesPrefix: TrackQuota:2 PoolSize:0 UsersBaseDir: Actions:{ExecuteOn:[] ExecuteFor:[] Hook:} ExternalAuthHook: ExternalAuthScope:0 PreLoginHook: PostLoginHook: PostLoginScope:0 CheckPasswordHook: CheckPasswordScope:0 UpdateMode:0 PasswordHashing:{BcryptOptions:{Cost:10} Argon2Options:{Memory:65536 Iterations:1 Parallelism:2} Algo:bcrypt} PasswordValidation:{Admins:{MinEntropy:0} Users:{MinEntropy:0}} PasswordCaching:true DelayedQuotaUpdate:0 CreateDefaultAdmin:false NamingRules:1 IsShared:0 Node:{Host: Port:0 Proto:http} BackupsPath:backups} HTTPDConfig:{Bindings:[{Address:10.0.10.11 Port:15000 EnableWebAdmin:true EnableWebClient:true EnableRESTAPI:true EnabledLoginMethods:0 EnableHTTPS:false CertificateFile: CertificateKeyFile: MinTLSVersion:12 ClientAuthType:0 TLSCipherSuites:[] Protocols:[] ProxyAllowed:[] ClientIPProxyHeader: ClientIPHeaderDepth:0 HideLoginURL:0 RenderOpenAPI:true OIDC:{ClientID: ClientSecret: ClientSecretFile: ConfigURL: RedirectBaseURL: UsernameField: RoleField: ImplicitRoles:false Scopes:[openid profile email] CustomFields:[] InsecureSkipSignatureCheck:false Debug:false provider:<nil> verifier:<nil> providerLogoutURL: oauth2Config:<nil>} Security:{Enabled:false AllowedHosts:[] AllowedHostsAreRegex:false HostsProxyHeaders:[] HTTPSRedirect:false HTTPSHost: HTTPSProxyHeaders:[] STSSeconds:0 STSIncludeSubdomains:false STSPreload:false ContentTypeNosniff:false ContentSecurityPolicy: PermissionsPolicy: CrossOriginOpenerPolicy: proxyHeaders:[]} Branding:{WebAdmin:{Name: ShortName: LogoPath: FaviconPath: DisclaimerName: DisclaimerPath: DefaultCSS:[] ExtraCSS:[]} WebClient:{Name: ShortName: LogoPath: FaviconPath: DisclaimerName: DisclaimerPath: DefaultCSS:[] ExtraCSS:[]}} allowHeadersFrom:[]}] TemplatesPath:templates StaticFilesPath:static OpenAPIPath:openapi WebRoot: CertificateFile: CertificateKeyFile: CACertificates:[] CARevocationLists:[] SigningPassphrase: SigningPassphraseFile: TokenValidation:0 MaxUploadFileSize:0 Cors:{AllowedOrigins:[] AllowedMethods:[] AllowedHeaders:[] ExposedHeaders:[] AllowCredentials:false Enabled:false MaxAge:0 OptionsPassthrough:false OptionsSuccessStatus:0 AllowPrivateNetwork:false} Setup:{InstallationCode: InstallationCodeHint:Installation code} HideSupportLink:false acmeDomain:} HTTPConfig:{Timeout:20 RetryWaitMin:2 RetryWaitMax:30 RetryMax:3 CACertificates:[] Certificates:[] SkipTLSVerify:false Headers:[] customTransport:<nil>} CommandConfig:{Timeout:30 Env:[] Commands:[]} KMSConfig:{Secrets:{URL: MasterKeyPath: MasterKeyString: masterKey:}} MFAConfig:{TOTP:[{Name:Default Issuer:SFTPGo Algo:sha1 algo:0}]} TelemetryConfig:{BindPort:0 BindAddress:127.0.0.1 EnableProfiler:false AuthUserFile: CertificateFile: CertificateKeyFile: TLSCipherSuites:[] MinTLSVersion:12 Protocols:[]} PluginsConfig:[] SMTPConfig:{Host: Port:587 From: User: Password: AuthType:0 Encryption:0 Domain: TemplatesPath:templates Debug:0 OAuth2:{Provider:0 Tenant: ClientID: ClientSecret: RefreshToken: mu:<nil> config:<nil> accessToken:<nil>}}}"}
{"level":"info","time":"2024-09-26T15:57:22.829","sender":"kms","message":"secret provider registered for scheme: \"builtin\", encrypted status: \"AES-256-GCM\""}
{"level":"info","time":"2024-09-26T15:57:22.829","sender":"kms","message":"secret provider registered for scheme: \"local\", encrypted status: \"Secretbox\""}
{"level":"debug","time":"2024-09-26T15:57:22.829","sender":"dataprovider_sqlite","message":"sqlite database handle created, connection string: \"file:C:\\\\ProgramData\\\\SFTPGo\\\\sftpgo.db?cache=shared&_foreign_keys=1\""}
{"level":"debug","time":"2024-09-26T15:57:22.831","sender":"dataprovider_sqlite","message":"sql database is up to date, current version: 29"}
{"level":"debug","time":"2024-09-26T15:57:22.831","sender":"dataprovider_sqlite","message":"absolute backup path \"C:\\\\ProgramData\\\\SFTPGo\\\\backups\""}
{"level":"debug","time":"2024-09-26T15:57:22.831","sender":"dataprovider_sqlite","message":"delayed quota update loop started, wait time: 0s"}
{"level":"debug","time":"2024-09-26T15:57:22.831","sender":"plugins","message":"initialize"}
{"level":"debug","time":"2024-09-26T15:57:22.831","sender":"dataprovider_sqlite","message":"delayed quota update loop ended, wait time: 0s"}
{"level":"debug","time":"2024-09-26T15:57:22.832","sender":"util","message":"found share data path for name \"templates\": \"C:\\\\ProgramData\\\\SFTPGo\\\\templates\""}
{"level":"debug","time":"2024-09-26T15:57:22.832","sender":"smtp","message":"loading templates from \"C:\\\\ProgramData\\\\SFTPGo\\\\templates\\\\email\""}
{"level":"debug","time":"2024-09-26T15:57:22.832","sender":"smtp","message":"activating initial config"}
{"level":"debug","time":"2024-09-26T15:57:22.832","sender":"smtp","message":"configuration disabled, email capabilities will not be available"}
{"level":"debug","time":"2024-09-26T15:57:22.832","sender":"eventmanager","message":"loading updated rules"}
{"level":"debug","time":"2024-09-26T15:57:22.832","sender":"eventmanager","message":"recently updated event rules loaded: 0"}
{"level":"debug","time":"2024-09-26T15:57:22.832","sender":"eventmanager","message":"event rules updated, fs events: 0, provider events: 0, schedules: 0, ip blocked events: 0, certificate events: 0, IDP login events: 0"}
{"level":"info","time":"2024-09-26T15:57:22.832","sender":"common","message":"scheduled overquota transfers check, schedule \"@every 1m0s\""}
{"level":"info","time":"2024-09-26T15:57:22.832","sender":"common","message":"scheduled idle connections check, schedule \"@every 3m0s\""}
{"level":"info","time":"2024-09-26T15:57:22.832","sender":"common","message":"using memory transfer checker"}
{"level":"info","time":"2024-09-26T15:57:22.832","sender":"acme","message":"no domains configured, acme disabled"}
{"level":"info","time":"2024-09-26T15:57:22.832","sender":"service","message":"SFTP server not started, disabled in config file"}
{"level":"info","time":"2024-09-26T15:57:22.832","sender":"service","message":"WebDAV server not started, disabled in config file"}
{"level":"info","time":"2024-09-26T15:57:22.832","sender":"service","message":"telemetry server not started, disabled in config file"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"service","message":"Windows service started"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"ftpd","message":"initializing FTP server with config {Bindings:[{Address:10.0.2.42 Port:21 ApplyProxyConfig:true TLSMode:0 TLSSessionReuse:0 CertificateFile: CertificateKeyFile: MinTLSVersion:12 ForcePassiveIP:9.9.78.42 PassiveIPOverrides:[] PassiveHost: ClientAuthType:0 TLSCipherSuites:[] PassiveConnectionsSecurity:0 ActiveConnectionsSecurity:0 IgnoreASCIITransferType:0 Debug:false ciphers:[]} {Address:10.0.2.41 Port:9090 ApplyProxyConfig:false TLSMode:0 TLSSessionReuse:0 CertificateFile: CertificateKeyFile: MinTLSVersion:0 ForcePassiveIP:9.9.78.41 PassiveIPOverrides:[] PassiveHost: ClientAuthType:0 TLSCipherSuites:[] PassiveConnectionsSecurity:0 ActiveConnectionsSecurity:0 IgnoreASCIITransferType:0 Debug:false ciphers:[]} {Address:10.0.2.40 Port:21 ApplyProxyConfig:false TLSMode:0 TLSSessionReuse:0 CertificateFile: CertificateKeyFile: MinTLSVersion:0 ForcePassiveIP:9.9.78.40 PassiveIPOverrides:[] PassiveHost: ClientAuthType:0 TLSCipherSuites:[] PassiveConnectionsSecurity:0 ActiveConnectionsSecurity:0 IgnoreASCIITransferType:0 Debug:false ciphers:[]} {Address:10.0.2.43 Port:73 ApplyProxyConfig:false TLSMode:0 TLSSessionReuse:0 CertificateFile: CertificateKeyFile: MinTLSVersion:0 ForcePassiveIP:9.9.78.43 PassiveIPOverrides:[] PassiveHost: ClientAuthType:0 TLSCipherSuites:[] PassiveConnectionsSecurity:0 ActiveConnectionsSecurity:0 IgnoreASCIITransferType:0 Debug:false ciphers:[]}] BannerFile: CertificateFile: CertificateKeyFile: CACertificates:[] CARevocationLists:[] ActiveTransfersPortNon20:true DisableActiveMode:true EnableSite:false HASHSupport:1 CombineSupport:1 PassivePortRange:{Start:9091 End:9900} acmeDomain:}"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"ftpd","message":"starting FTP serving, binding: 10.0.2.43:73"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"ftpd","message":"starting FTP serving, binding: 10.0.2.42:21"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"ftpd","message":"starting FTP serving, binding: 10.0.2.41:9090"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"ftpd","message":"starting FTP serving, binding: 10.0.2.40:21"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"httpd","message":"initializing HTTP server with config {Bindings:[{Address:10.0.10.11 Port:15000 EnableWebAdmin:true EnableWebClient:true EnableRESTAPI:true EnabledLoginMethods:0 EnableHTTPS:false CertificateFile: CertificateKeyFile: MinTLSVersion:12 ClientAuthType:0 TLSCipherSuites:[] Protocols:[] ProxyAllowed:[] ClientIPProxyHeader: ClientIPHeaderDepth:0 HideLoginURL:0 RenderOpenAPI:true OIDC:{ClientID: ClientSecret: ClientSecretFile: ConfigURL: RedirectBaseURL: UsernameField: RoleField: ImplicitRoles:false Scopes:[openid profile email] CustomFields:[] InsecureSkipSignatureCheck:false Debug:false provider:<nil> verifier:<nil> providerLogoutURL: oauth2Config:<nil>} Security:{Enabled:false AllowedHosts:[] AllowedHostsAreRegex:false HostsProxyHeaders:[] HTTPSRedirect:false HTTPSHost: HTTPSProxyHeaders:[] STSSeconds:0 STSIncludeSubdomains:false STSPreload:false ContentTypeNosniff:false ContentSecurityPolicy: PermissionsPolicy: CrossOriginOpenerPolicy: proxyHeaders:[]} Branding:{WebAdmin:{Name: ShortName: LogoPath: FaviconPath: DisclaimerName: DisclaimerPath: DefaultCSS:[] ExtraCSS:[]} WebClient:{Name: ShortName: LogoPath: FaviconPath: DisclaimerName: DisclaimerPath: DefaultCSS:[] ExtraCSS:[]}} allowHeadersFrom:[]}] TemplatesPath:templates StaticFilesPath:static OpenAPIPath:openapi WebRoot: CertificateFile: CertificateKeyFile: CACertificates:[] CARevocationLists:[] SigningPassphrase: SigningPassphraseFile: TokenValidation:0 MaxUploadFileSize:0 Cors:{AllowedOrigins:[] AllowedMethods:[] AllowedHeaders:[] ExposedHeaders:[] AllowCredentials:false Enabled:false MaxAge:0 OptionsPassthrough:false OptionsSuccessStatus:0 AllowPrivateNetwork:false} Setup:{InstallationCode: InstallationCodeHint:Installation code} HideSupportLink:false acmeDomain:}"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"httpd","message":"using memory token manager"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"httpd","message":"using memory reset code manager"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"httpd","message":"using memory OIDC manager"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"httpd","message":"using memory OAuth2 manager"}
{"level":"info","time":"2024-09-26T15:57:22.833","sender":"httpd","message":"using memory task manager"}
{"level":"debug","time":"2024-09-26T15:57:22.833","sender":"util","message":"found share data path for name \"static\": \"C:\\\\ProgramData\\\\SFTPGo\\\\static\""}
{"level":"debug","time":"2024-09-26T15:57:22.833","sender":"util","message":"found share data path for name \"templates\": \"C:\\\\ProgramData\\\\SFTPGo\\\\templates\""}
{"level":"debug","time":"2024-09-26T15:57:22.833","sender":"util","message":"found share data path for name \"openapi\": \"C:\\\\ProgramData\\\\SFTPGo\\\\openapi\""}
{"level":"error","time":"2024-09-26T15:57:22.834","sender":"util","message":"unable to bind on tcp4 address: listen tcp4 :21: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted."}
{"level":"info","time":"2024-09-26T15:57:22.834","sender":"ftpserverlib","server_id":"FTP_3","address":"10.0.2.43:73","message":"Listening..."}

sftpgo.log

What are you using SFTPGo for?

Enterprise

Additional info

I've been trying to go around the bug by creating 4 different sftpgo instances, but did'nt succeed to create different SFTPGo services under windows.

I might be able to make a pull request for the fix with information on where the problem happen, in SFTPGo or ftpserverlib

Also i'd be able to provide you an Azure VM to test if it helps

thank you very much.

@pollier pollier added the bug Something isn't working label Sep 27, 2024
@drakkan
Copy link
Owner

drakkan commented Sep 27, 2024

It seems to work for me (both Linux and Windows), at least the simple uses cases I have tested

{"level":"info","time":"2024-09-27T10:45:15.356","sender":"ftpd","message":"starting FTP serving, binding: 127.0.0.1:21"}
{"level":"info","time":"2024-09-27T10:45:15.356","sender":"ftpserverlib","server_id":"FTP_1","address":"127.0.0.1:21","message":"Listening..."}
{"level":"info","time":"2024-09-27T10:45:15.356","sender":"ftpserverlib","server_id":"FTP_1","message":"Starting..."}
{"level":"info","time":"2024-09-27T10:45:15.356","sender":"ftpd","message":"starting FTP serving, binding: 192.168.1.95:21"}
{"level":"info","time":"2024-09-27T10:45:15.357","sender":"ftpserverlib","server_id":"FTP_0","address":"192.168.1.95:21","message":"Listening..."}
{"level":"info","time":"2024-09-27T10:45:15.357","sender":"ftpserverlib","server_id":"FTP_0","message":"Starting..."}
{"level":"info","time":"2024-09-27T10:45:15.424","sender":"service","message":"Windows service started"}

I might be able to make a pull request for the fix with information on where the problem happen, in SFTPGo or ftpserverlib

Sure, feel free to send a PR, that's how open source works, if you find a problem you have to be able to self-support

Also i'd be able to provide you an Azure VM to test if it helps

No thanks, we have provided free support this way in the past but we no longer do so.

We provide commercial support for those interested.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants