Browse Source

move SFTPGo package to the internal folder

SFTPGo is a daemon and command line tool, not a library.

The public API are provided by the SDK

Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
Nicola Murino 3 năm trước cách đây
mục cha
commit
c8158e14e0
100 tập tin đã thay đổi với 330 bổ sung345 xóa
  1. 17 17
      .github/workflows/development.yml
  2. 7 7
      .github/workflows/release.yml
  3. 1 1
      Dockerfile
  4. 1 1
      Dockerfile.alpine
  5. 1 1
      Dockerfile.distroless
  6. 3 3
      docs/build-from-source.md
  7. 0 0
      internal/acme/account.go
  8. 7 7
      internal/acme/acme.go
  9. 4 4
      internal/cmd/acme.go
  10. 0 0
      internal/cmd/awscontainer.go
  11. 0 0
      internal/cmd/awscontainer_disabled.go
  12. 0 0
      internal/cmd/gen.go
  13. 0 0
      internal/cmd/gencompletion.go
  14. 2 2
      internal/cmd/genman.go
  15. 5 5
      internal/cmd/initprovider.go
  16. 2 2
      internal/cmd/install_windows.go
  17. 7 7
      internal/cmd/portable.go
  18. 1 1
      internal/cmd/portable_disabled.go
  19. 1 1
      internal/cmd/reload_windows.go
  20. 4 4
      internal/cmd/resetprovider.go
  21. 4 4
      internal/cmd/revertprovider.go
  22. 1 1
      internal/cmd/root.go
  23. 1 1
      internal/cmd/rotatelogs_windows.go
  24. 2 2
      internal/cmd/serve.go
  25. 0 0
      internal/cmd/service_windows.go
  26. 4 4
      internal/cmd/smtptest.go
  27. 2 2
      internal/cmd/start_windows.go
  28. 7 7
      internal/cmd/startsubsys.go
  29. 1 1
      internal/cmd/status_windows.go
  30. 1 1
      internal/cmd/stop_windows.go
  31. 1 1
      internal/cmd/uninstall_windows.go
  32. 0 0
      internal/command/command.go
  33. 0 0
      internal/command/command_test.go
  34. 6 6
      internal/common/actions.go
  35. 3 3
      internal/common/actions_test.go
  36. 1 1
      internal/common/clientsmap.go
  37. 0 0
      internal/common/clientsmap_test.go
  38. 8 8
      internal/common/common.go
  39. 10 7
      internal/common/common_test.go
  40. 4 4
      internal/common/connection.go
  41. 4 4
      internal/common/connection_test.go
  42. 6 6
      internal/common/dataretention.go
  43. 7 7
      internal/common/dataretention_test.go
  44. 3 3
      internal/common/defender.go
  45. 0 0
      internal/common/defender_test.go
  46. 3 3
      internal/common/defenderdb.go
  47. 2 2
      internal/common/defenderdb_test.go
  48. 2 2
      internal/common/defendermem.go
  49. 2 2
      internal/common/httpauth.go
  50. 0 0
      internal/common/httpauth_test.go
  51. 14 14
      internal/common/protocol_test.go
  52. 1 1
      internal/common/ratelimiter.go
  53. 1 1
      internal/common/ratelimiter_test.go
  54. 2 2
      internal/common/tlsutils.go
  55. 0 0
      internal/common/tlsutils_test.go
  56. 4 4
      internal/common/transfer.go
  57. 3 3
      internal/common/transfer_test.go
  58. 3 3
      internal/common/transferschecker.go
  59. 3 3
      internal/common/transferschecker_test.go
  60. 17 17
      internal/config/config.go
  61. 0 0
      internal/config/config_linux.go
  62. 0 0
      internal/config/config_nolinux.go
  63. 16 37
      internal/config/config_test.go
  64. 5 5
      internal/dataprovider/actions.go
  65. 4 4
      internal/dataprovider/admin.go
  66. 2 2
      internal/dataprovider/apikey.go
  67. 4 4
      internal/dataprovider/bolt.go
  68. 1 1
      internal/dataprovider/bolt_disabled.go
  69. 0 0
      internal/dataprovider/cachedpassword.go
  70. 2 2
      internal/dataprovider/cacheduser.go
  71. 8 8
      internal/dataprovider/dataprovider.go
  72. 5 5
      internal/dataprovider/eventrule.go
  73. 3 3
      internal/dataprovider/eventruleutil.go
  74. 4 4
      internal/dataprovider/group.go
  75. 3 3
      internal/dataprovider/memory.go
  76. 3 3
      internal/dataprovider/mysql.go
  77. 1 1
      internal/dataprovider/mysql_disabled.go
  78. 3 3
      internal/dataprovider/pgsql.go
  79. 1 1
      internal/dataprovider/pgsql_disabled.go
  80. 1 1
      internal/dataprovider/quota.go
  81. 1 1
      internal/dataprovider/quotaupdater.go
  82. 3 3
      internal/dataprovider/scheduler.go
  83. 0 0
      internal/dataprovider/session.go
  84. 2 2
      internal/dataprovider/share.go
  85. 3 3
      internal/dataprovider/sqlcommon.go
  86. 4 4
      internal/dataprovider/sqlite.go
  87. 1 1
      internal/dataprovider/sqlite_disabled.go
  88. 1 1
      internal/dataprovider/sqlqueries.go
  89. 6 6
      internal/dataprovider/user.go
  90. 4 4
      internal/ftpd/cryptfs_test.go
  91. 3 3
      internal/ftpd/ftpd.go
  92. 11 11
      internal/ftpd/ftpd_test.go
  93. 4 4
      internal/ftpd/handler.go
  94. 8 5
      internal/ftpd/internal_test.go
  95. 6 6
      internal/ftpd/server.go
  96. 2 2
      internal/ftpd/transfer.go
  97. 2 2
      internal/httpclient/httpclient.go
  98. 3 3
      internal/httpd/api_admin.go
  99. 2 2
      internal/httpd/api_defender.go
  100. 2 2
      internal/httpd/api_eventrule.go

+ 17 - 17
.github/workflows/development.yml

@@ -32,7 +32,7 @@ jobs:
       - name: Build for Linux/macOS x86_64
         if: startsWith(matrix.os, 'windows-') != true
         run: |
-          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -o sftpgo
+          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
           cd tests/eventsearcher
           go build -trimpath -ldflags "-s -w" -o eventsearcher
           cd -
@@ -44,7 +44,7 @@ jobs:
 
       - name: Build for macOS arm64
         if: startsWith(matrix.os, 'macos-') == true
-        run: CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 SDKROOT=$(xcrun --sdk macosx --show-sdk-path) go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -o sftpgo_arm64
+        run: CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 SDKROOT=$(xcrun --sdk macosx --show-sdk-path) go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo_arm64
 
       - name: Build for Windows
         if: startsWith(matrix.os, 'windows-')
@@ -57,7 +57,7 @@ jobs:
           $FILE_VERSION = $LATEST_TAG.substring(1)  + "." + $COMMITS_FROM_TAG
           go install github.com/tc-hib/go-winres@latest
           go-winres simply --arch amd64 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon  .\windows-installer\icon.ico
-          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/version.date=$DATE_TIME" -o sftpgo.exe
+          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o sftpgo.exe
           cd tests/eventsearcher
           go build -trimpath -ldflags "-s -w" -o eventsearcher.exe
           cd ../..
@@ -69,11 +69,11 @@ jobs:
           $Env:GOOS='windows'
           $Env:GOARCH='arm64'
           go-winres simply --arch arm64 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon  .\windows-installer\icon.ico
-          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/version.date=$DATE_TIME" -o .\arm64\sftpgo.exe
+          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\arm64\sftpgo.exe
           mkdir x86
           $Env:GOARCH='386'
           go-winres simply --arch 386 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon  .\windows-installer\icon.ico
-          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/version.date=$DATE_TIME" -o .\x86\sftpgo.exe
+          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\x86\sftpgo.exe
           Remove-Item Env:\CGO_ENABLED
           Remove-Item Env:\GOOS
           Remove-Item Env:\GOARCH
@@ -90,15 +90,15 @@ jobs:
 
       - name: Run test cases using bolt provider
         run: |
-          go test -v -p 1 -timeout 2m ./config -covermode=atomic
-          go test -v -p 1 -timeout 5m ./common -covermode=atomic
-          go test -v -p 1 -timeout 5m ./httpd -covermode=atomic
-          go test -v -p 1 -timeout 8m ./sftpd -covermode=atomic
-          go test -v -p 1 -timeout 5m ./ftpd -covermode=atomic
-          go test -v -p 1 -timeout 5m ./webdavd -covermode=atomic
-          go test -v -p 1 -timeout 2m ./telemetry -covermode=atomic
-          go test -v -p 1 -timeout 2m ./mfa -covermode=atomic
-          go test -v -p 1 -timeout 2m ./command -covermode=atomic
+          go test -v -p 1 -timeout 2m ./internal/config -covermode=atomic
+          go test -v -p 1 -timeout 5m ./internal/common -covermode=atomic
+          go test -v -p 1 -timeout 5m ./internal/httpd -covermode=atomic
+          go test -v -p 1 -timeout 8m ./internal/sftpd -covermode=atomic
+          go test -v -p 1 -timeout 5m ./internal/ftpd -covermode=atomic
+          go test -v -p 1 -timeout 5m ./internal/webdavd -covermode=atomic
+          go test -v -p 1 -timeout 2m ./internal/telemetry -covermode=atomic
+          go test -v -p 1 -timeout 2m ./internal/mfa -covermode=atomic
+          go test -v -p 1 -timeout 2m ./internal/command -covermode=atomic
         env:
           SFTPGO_DATA_PROVIDER__DRIVER: bolt
           SFTPGO_DATA_PROVIDER__NAME: 'sftpgo_bolt.db'
@@ -310,7 +310,7 @@ jobs:
 
       - name: Build
         run: |
-          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -o sftpgo
+          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
           cd tests/eventsearcher
           go build -trimpath -ldflags "-s -w" -o eventsearcher
           cd -
@@ -410,7 +410,7 @@ jobs:
       - name: Build on amd64
         if: ${{ matrix.arch == 'amd64' }}
         run: |
-          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -o sftpgo
+          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
           mkdir -p output/{init,bash_completion,zsh_completion}
           cp sftpgo.json output/
           cp -r templates output/
@@ -457,7 +457,7 @@ jobs:
             then
               export GOARM=7
             fi
-            go build -buildvcs=false -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -o sftpgo
+            go build -buildvcs=false -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
             mkdir -p output/{init,bash_completion,zsh_completion}
             cp sftpgo.json output/
             cp -r templates output/

+ 7 - 7
.github/workflows/release.yml

@@ -71,11 +71,11 @@ jobs:
 
       - name: Build for macOS x86_64
         if: startsWith(matrix.os, 'windows-') != true
-        run: go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -o sftpgo
+        run: go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
 
       - name: Build for macOS arm64
         if: startsWith(matrix.os, 'macos-') == true
-        run: CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 SDKROOT=$(xcrun --sdk macosx --show-sdk-path) go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -o sftpgo_arm64
+        run: CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 SDKROOT=$(xcrun --sdk macosx --show-sdk-path) go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo_arm64
 
       - name: Build for Windows
         if: startsWith(matrix.os, 'windows-')
@@ -85,17 +85,17 @@ jobs:
           $FILE_VERSION = $Env:SFTPGO_VERSION.substring(1)  + ".0"
           go install github.com/tc-hib/go-winres@latest
           go-winres simply --arch amd64 --product-version $Env:SFTPGO_VERSION-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon  .\windows-installer\icon.ico
-          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/version.date=$DATE_TIME" -o sftpgo.exe
+          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o sftpgo.exe
           mkdir arm64
           $Env:CGO_ENABLED='0'
           $Env:GOOS='windows'
           $Env:GOARCH='arm64'
           go-winres simply --arch arm64 --product-version $Env:SFTPGO_VERSION-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon  .\windows-installer\icon.ico
-          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/version.date=$DATE_TIME" -o .\arm64\sftpgo.exe
+          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\arm64\sftpgo.exe
           mkdir x86
           $Env:GOARCH='386'
           go-winres simply --arch 386 --product-version $Env:SFTPGO_VERSION-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0" --original-filename sftpgo.exe --icon  .\windows-installer\icon.ico
-          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/version.date=$DATE_TIME" -o .\x86\sftpgo.exe
+          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\x86\sftpgo.exe
           Remove-Item Env:\CGO_ENABLED
           Remove-Item Env:\GOOS
           Remove-Item Env:\GOARCH
@@ -302,7 +302,7 @@ jobs:
       - name: Build on amd64
         if: ${{ matrix.arch == 'amd64' }}
         run: |
-          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -o sftpgo
+          go build -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
           mkdir -p output/{init,sqlite,bash_completion,zsh_completion}
           echo "For documentation please take a look here:" > output/README.txt
           echo "" >> output/README.txt
@@ -350,7 +350,7 @@ jobs:
             tar -C /usr/local -xzf go.tar.gz
           run: |
             export PATH=$PATH:/usr/local/go/bin
-            go build -buildvcs=false -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -o sftpgo
+            go build -buildvcs=false -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
             mkdir -p output/{init,sqlite,bash_completion,zsh_completion}
             echo "For documentation please take a look here:" > output/README.txt
             echo "" >> output/README.txt

+ 1 - 1
Dockerfile

@@ -21,7 +21,7 @@ COPY . .
 
 RUN set -xe && \
     export COMMIT_SHA=${COMMIT_SHA:-$(git describe --always --dirty)} && \
-    go build $(if [ -n "${FEATURES}" ]; then echo "-tags ${FEATURES}"; fi) -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=${COMMIT_SHA} -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -v -o sftpgo
+    go build $(if [ -n "${FEATURES}" ]; then echo "-tags ${FEATURES}"; fi) -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${COMMIT_SHA} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -v -o sftpgo
 
 FROM debian:bullseye-slim
 

+ 1 - 1
Dockerfile.alpine

@@ -23,7 +23,7 @@ COPY . .
 
 RUN set -xe && \
     export COMMIT_SHA=${COMMIT_SHA:-$(git describe --always --dirty)} && \
-    go build $(if [ -n "${FEATURES}" ]; then echo "-tags ${FEATURES}"; fi) -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=${COMMIT_SHA} -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -v -o sftpgo
+    go build $(if [ -n "${FEATURES}" ]; then echo "-tags ${FEATURES}"; fi) -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${COMMIT_SHA} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -v -o sftpgo
 
 
 FROM alpine:3.16

+ 1 - 1
Dockerfile.distroless

@@ -21,7 +21,7 @@ COPY . .
 
 RUN set -xe && \
     export COMMIT_SHA=${COMMIT_SHA:-$(git describe --always --dirty)} && \
-    go build $(if [ -n "${FEATURES}" ]; then echo "-tags ${FEATURES}"; fi) -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=${COMMIT_SHA} -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -v -o sftpgo
+    go build $(if [ -n "${FEATURES}" ]; then echo "-tags ${FEATURES}"; fi) -trimpath -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${COMMIT_SHA} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -v -o sftpgo
 
 # Modify the default configuration file
 RUN sed -i 's|"users_base_dir": "",|"users_base_dir": "/srv/sftpgo/data",|' sftpgo.json && \

+ 3 - 3
docs/build-from-source.md

@@ -23,13 +23,13 @@ The compiler is a build time only dependency. It is not required at runtime.
 
 Version info, such as git commit and build date, can be embedded setting the following string variables at build time:
 
-- `github.com/drakkan/sftpgo/v2/version.commit`
-- `github.com/drakkan/sftpgo/v2/version.date`
+- `github.com/drakkan/sftpgo/v2/internal/version.commit`
+- `github.com/drakkan/sftpgo/v2/internal/version.date`
 
 For example, you can build using the following command:
 
 ```bash
-go build -tags nogcs,nos3,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/version.date=`date -u +%FT%TZ`" -o sftpgo
+go build -tags nogcs,nos3,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
 ```
 
 You should get a version that includes git commit, build date and available features like this one:

+ 0 - 0
acme/account.go → internal/acme/account.go


+ 7 - 7
acme/acme.go → internal/acme/acme.go

@@ -45,13 +45,13 @@ import (
 	"github.com/go-acme/lego/v4/registration"
 	"github.com/robfig/cron/v3"
 
-	"github.com/drakkan/sftpgo/v2/ftpd"
-	"github.com/drakkan/sftpgo/v2/httpd"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/telemetry"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/version"
-	"github.com/drakkan/sftpgo/v2/webdavd"
+	"github.com/drakkan/sftpgo/v2/internal/ftpd"
+	"github.com/drakkan/sftpgo/v2/internal/httpd"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/telemetry"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/version"
+	"github.com/drakkan/sftpgo/v2/internal/webdavd"
 )
 
 const (

+ 4 - 4
cmd/acme.go → internal/cmd/acme.go

@@ -20,10 +20,10 @@ import (
 	"github.com/rs/zerolog"
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/acme"
-	"github.com/drakkan/sftpgo/v2/config"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/acme"
+	"github.com/drakkan/sftpgo/v2/internal/config"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 0 - 0
cmd/awscontainer.go → internal/cmd/awscontainer.go


+ 0 - 0
cmd/awscontainer_disabled.go → internal/cmd/awscontainer_disabled.go


+ 0 - 0
cmd/gen.go → internal/cmd/gen.go


+ 0 - 0
cmd/gencompletion.go → internal/cmd/gencompletion.go


+ 2 - 2
cmd/genman.go → internal/cmd/genman.go

@@ -24,8 +24,8 @@ import (
 	"github.com/spf13/cobra"
 	"github.com/spf13/cobra/doc"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/version"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/version"
 )
 
 var (

+ 5 - 5
cmd/initprovider.go → internal/cmd/initprovider.go

@@ -21,11 +21,11 @@ import (
 	"github.com/spf13/cobra"
 	"github.com/spf13/viper"
 
-	"github.com/drakkan/sftpgo/v2/config"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/service"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/config"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/service"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 2 - 2
cmd/install_windows.go → internal/cmd/install_windows.go

@@ -21,8 +21,8 @@ import (
 
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/service"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/service"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 7 - 7
cmd/portable.go → internal/cmd/portable.go

@@ -27,13 +27,13 @@ import (
 	"github.com/sftpgo/sdk"
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/service"
-	"github.com/drakkan/sftpgo/v2/sftpd"
-	"github.com/drakkan/sftpgo/v2/version"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/service"
+	"github.com/drakkan/sftpgo/v2/internal/sftpd"
+	"github.com/drakkan/sftpgo/v2/internal/version"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 var (

+ 1 - 1
cmd/portable_disabled.go → internal/cmd/portable_disabled.go

@@ -17,7 +17,7 @@
 
 package cmd
 
-import "github.com/drakkan/sftpgo/v2/version"
+import "github.com/drakkan/sftpgo/v2/internal/version"
 
 func init() {
 	version.AddFeature("-portable")

+ 1 - 1
cmd/reload_windows.go → internal/cmd/reload_windows.go

@@ -20,7 +20,7 @@ import (
 
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/service"
+	"github.com/drakkan/sftpgo/v2/internal/service"
 )
 
 var (

+ 4 - 4
cmd/resetprovider.go → internal/cmd/resetprovider.go

@@ -23,10 +23,10 @@ import (
 	"github.com/spf13/cobra"
 	"github.com/spf13/viper"
 
-	"github.com/drakkan/sftpgo/v2/config"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/config"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 4 - 4
cmd/revertprovider.go → internal/cmd/revertprovider.go

@@ -21,10 +21,10 @@ import (
 	"github.com/spf13/cobra"
 	"github.com/spf13/viper"
 
-	"github.com/drakkan/sftpgo/v2/config"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/config"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 1 - 1
cmd/root.go → internal/cmd/root.go

@@ -22,7 +22,7 @@ import (
 	"github.com/spf13/cobra"
 	"github.com/spf13/viper"
 
-	"github.com/drakkan/sftpgo/v2/version"
+	"github.com/drakkan/sftpgo/v2/internal/version"
 )
 
 const (

+ 1 - 1
cmd/rotatelogs_windows.go → internal/cmd/rotatelogs_windows.go

@@ -20,7 +20,7 @@ import (
 
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/service"
+	"github.com/drakkan/sftpgo/v2/internal/service"
 )
 
 var (

+ 2 - 2
cmd/serve.go → internal/cmd/serve.go

@@ -19,8 +19,8 @@ import (
 
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/service"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/service"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 0 - 0
cmd/service_windows.go → internal/cmd/service_windows.go


+ 4 - 4
cmd/smtptest.go → internal/cmd/smtptest.go

@@ -20,10 +20,10 @@ import (
 	"github.com/rs/zerolog"
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/config"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/smtp"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/config"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/smtp"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 2 - 2
cmd/start_windows.go → internal/cmd/start_windows.go

@@ -21,8 +21,8 @@ import (
 
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/service"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/service"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 7 - 7
cmd/startsubsys.go → internal/cmd/startsubsys.go

@@ -25,13 +25,13 @@ import (
 	"github.com/spf13/cobra"
 	"github.com/spf13/viper"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/config"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/sftpd"
-	"github.com/drakkan/sftpgo/v2/version"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/config"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/sftpd"
+	"github.com/drakkan/sftpgo/v2/internal/version"
 )
 
 var (

+ 1 - 1
cmd/status_windows.go → internal/cmd/status_windows.go

@@ -20,7 +20,7 @@ import (
 
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/service"
+	"github.com/drakkan/sftpgo/v2/internal/service"
 )
 
 var (

+ 1 - 1
cmd/stop_windows.go → internal/cmd/stop_windows.go

@@ -20,7 +20,7 @@ import (
 
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/service"
+	"github.com/drakkan/sftpgo/v2/internal/service"
 )
 
 var (

+ 1 - 1
cmd/uninstall_windows.go → internal/cmd/uninstall_windows.go

@@ -20,7 +20,7 @@ import (
 
 	"github.com/spf13/cobra"
 
-	"github.com/drakkan/sftpgo/v2/service"
+	"github.com/drakkan/sftpgo/v2/internal/service"
 )
 
 var (

+ 0 - 0
command/command.go → internal/command/command.go


+ 0 - 0
command/command_test.go → internal/command/command_test.go


+ 6 - 6
common/actions.go → internal/common/actions.go

@@ -31,12 +31,12 @@ import (
 	"github.com/sftpgo/sdk"
 	"github.com/sftpgo/sdk/plugin/notifier"
 
-	"github.com/drakkan/sftpgo/v2/command"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/httpclient"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/command"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/httpclient"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 3 - 3
common/actions_test.go → internal/common/actions_test.go

@@ -29,9 +29,9 @@ import (
 	"github.com/sftpgo/sdk/plugin/notifier"
 	"github.com/stretchr/testify/assert"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 func TestNewActionNotification(t *testing.T) {

+ 1 - 1
common/clientsmap.go → internal/common/clientsmap.go

@@ -18,7 +18,7 @@ import (
 	"sync"
 	"sync/atomic"
 
-	"github.com/drakkan/sftpgo/v2/logger"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
 )
 
 // clienstMap is a struct containing the map of the connected clients

+ 0 - 0
common/clientsmap_test.go → internal/common/clientsmap_test.go


+ 8 - 8
common/common.go → internal/common/common.go

@@ -33,14 +33,14 @@ import (
 
 	"github.com/pires/go-proxyproto"
 
-	"github.com/drakkan/sftpgo/v2/command"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/httpclient"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/metric"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/command"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/httpclient"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/metric"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 // constants

+ 10 - 7
common/common_test.go → internal/common/common_test.go

@@ -35,21 +35,24 @@ import (
 	"github.com/stretchr/testify/require"
 	"golang.org/x/crypto/bcrypt"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (
 	logSenderTest    = "common_test"
 	httpAddr         = "127.0.0.1:9999"
-	configDir        = ".."
 	osWindows        = "windows"
 	userTestUsername = "common_test_username"
 )
 
+var (
+	configDir = filepath.Join(".", "..", "..")
+)
+
 type fakeConnection struct {
 	*BaseConnection
 	command string
@@ -149,7 +152,7 @@ func TestDefenderIntegration(t *testing.T) {
 	pluginsConfig := []plugin.Config{
 		{
 			Type:     "ipfilter",
-			Cmd:      filepath.Join(wdPath, "..", "tests", "ipfilter", "ipfilter"),
+			Cmd:      filepath.Join(wdPath, "..", "..", "tests", "ipfilter", "ipfilter"),
 			AutoMTLS: true,
 		},
 	}

+ 4 - 4
common/connection.go → internal/common/connection.go

@@ -28,10 +28,10 @@ import (
 	"github.com/pkg/sftp"
 	"github.com/sftpgo/sdk"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 // BaseConnection defines common fields for a connection using any supported protocol

+ 4 - 4
common/connection_test.go → internal/common/connection_test.go

@@ -27,10 +27,10 @@ import (
 	"github.com/sftpgo/sdk"
 	"github.com/stretchr/testify/assert"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 // MockOsFs mockable OsFs

+ 6 - 6
common/dataretention.go → internal/common/dataretention.go

@@ -29,12 +29,12 @@ import (
 	"sync"
 	"time"
 
-	"github.com/drakkan/sftpgo/v2/command"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/httpclient"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/smtp"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/command"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/httpclient"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/smtp"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 // RetentionCheckNotification defines the supported notification methods for a retention check result

+ 7 - 7
common/dataretention_test.go → internal/common/dataretention_test.go

@@ -26,8 +26,8 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/smtp"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/smtp"
 )
 
 func TestRetentionValidation(t *testing.T) {
@@ -94,7 +94,7 @@ func TestRetentionValidation(t *testing.T) {
 		Port:          25,
 		TemplatesPath: "templates",
 	}
-	err = smtpCfg.Initialize("..")
+	err = smtpCfg.Initialize(configDir)
 	require.NoError(t, err)
 
 	err = check.Validate()
@@ -106,7 +106,7 @@ func TestRetentionValidation(t *testing.T) {
 	assert.NoError(t, err)
 
 	smtpCfg = smtp.Config{}
-	err = smtpCfg.Initialize("..")
+	err = smtpCfg.Initialize(configDir)
 	require.NoError(t, err)
 
 	check.Notifications = []RetentionCheckNotification{RetentionCheckNotificationHook}
@@ -126,7 +126,7 @@ func TestRetentionEmailNotifications(t *testing.T) {
 		Port:          2525,
 		TemplatesPath: "templates",
 	}
-	err := smtpCfg.Initialize("..")
+	err := smtpCfg.Initialize(configDir)
 	require.NoError(t, err)
 
 	user := dataprovider.User{
@@ -160,13 +160,13 @@ func TestRetentionEmailNotifications(t *testing.T) {
 	assert.NoError(t, err)
 
 	smtpCfg.Port = 2626
-	err = smtpCfg.Initialize("..")
+	err = smtpCfg.Initialize(configDir)
 	require.NoError(t, err)
 	err = check.sendEmailNotification(1*time.Second, nil)
 	assert.Error(t, err)
 
 	smtpCfg = smtp.Config{}
-	err = smtpCfg.Initialize("..")
+	err = smtpCfg.Initialize(configDir)
 	require.NoError(t, err)
 	err = check.sendEmailNotification(1*time.Second, nil)
 	assert.Error(t, err)

+ 3 - 3
common/defender.go → internal/common/defender.go

@@ -25,9 +25,9 @@ import (
 
 	"github.com/yl2chen/cidranger"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 // HostEvent is the enumerable for the supported host events

+ 0 - 0
common/defender_test.go → internal/common/defender_test.go


+ 3 - 3
common/defenderdb.go → internal/common/defenderdb.go

@@ -17,9 +17,9 @@ package common
 import (
 	"time"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 type dbDefender struct {

+ 2 - 2
common/defenderdb_test.go → internal/common/defenderdb_test.go

@@ -24,8 +24,8 @@ import (
 
 	"github.com/stretchr/testify/assert"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 func TestBasicDbDefender(t *testing.T) {

+ 2 - 2
common/defendermem.go → internal/common/defendermem.go

@@ -18,8 +18,8 @@ import (
 	"sort"
 	"time"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 type memoryDefender struct {

+ 2 - 2
common/httpauth.go → internal/common/httpauth.go

@@ -24,8 +24,8 @@ import (
 	"github.com/GehirnInc/crypt/md5_crypt"
 	"golang.org/x/crypto/bcrypt"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 const (

+ 0 - 0
common/httpauth_test.go → internal/common/httpauth_test.go


+ 14 - 14
common/protocol_test.go → internal/common/protocol_test.go

@@ -46,21 +46,20 @@ import (
 	"github.com/stretchr/testify/require"
 	"golang.org/x/crypto/ssh"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/config"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/httpclient"
-	"github.com/drakkan/sftpgo/v2/httpdtest"
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/mfa"
-	"github.com/drakkan/sftpgo/v2/smtp"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/config"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/httpclient"
+	"github.com/drakkan/sftpgo/v2/internal/httpdtest"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/mfa"
+	"github.com/drakkan/sftpgo/v2/internal/smtp"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (
-	configDir           = ".."
 	httpAddr            = "127.0.0.1:9999"
 	httpProxyAddr       = "127.0.0.1:7777"
 	sftpServerAddr      = "127.0.0.1:4022"
@@ -74,6 +73,7 @@ const (
 )
 
 var (
+	configDir         = filepath.Join(".", "..", "..")
 	allPerms          = []string{dataprovider.PermAny}
 	homeBasePath      string
 	logFilePath       string
@@ -2827,7 +2827,7 @@ func TestEventRule(t *testing.T) {
 		From:          "notification@example.com",
 		TemplatesPath: "templates",
 	}
-	err := smtpCfg.Initialize("..")
+	err := smtpCfg.Initialize(configDir)
 	require.NoError(t, err)
 
 	a1 := dataprovider.BaseEventAction{
@@ -3086,7 +3086,7 @@ func TestEventRule(t *testing.T) {
 	assert.NoError(t, err)
 
 	smtpCfg = smtp.Config{}
-	err = smtpCfg.Initialize("..")
+	err = smtpCfg.Initialize(configDir)
 	require.NoError(t, err)
 }
 

+ 1 - 1
common/ratelimiter.go → internal/common/ratelimiter.go

@@ -25,7 +25,7 @@ import (
 
 	"golang.org/x/time/rate"
 
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 1 - 1
common/ratelimiter_test.go → internal/common/ratelimiter_test.go

@@ -21,7 +21,7 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 func TestRateLimiterConfig(t *testing.T) {

+ 2 - 2
common/tlsutils.go → internal/common/tlsutils.go

@@ -25,8 +25,8 @@ import (
 	"sync"
 	"time"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 const (

+ 0 - 0
common/tlsutils_test.go → internal/common/tlsutils_test.go


+ 4 - 4
common/transfer.go → internal/common/transfer.go

@@ -21,10 +21,10 @@ import (
 	"sync/atomic"
 	"time"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/metric"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/metric"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 var (

+ 3 - 3
common/transfer_test.go → internal/common/transfer_test.go

@@ -25,9 +25,9 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 func TestTransferUpdateQuota(t *testing.T) {

+ 3 - 3
common/transferschecker.go → internal/common/transferschecker.go

@@ -19,9 +19,9 @@ import (
 	"sync"
 	"time"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 type overquotaTransfer struct {

+ 3 - 3
common/transferschecker_test.go → internal/common/transferschecker_test.go

@@ -29,9 +29,9 @@ import (
 	"github.com/sftpgo/sdk"
 	"github.com/stretchr/testify/assert"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 func TestTransfersCheckerDiskQuota(t *testing.T) {

+ 17 - 17
config/config.go → internal/config/config.go

@@ -25,23 +25,23 @@ import (
 
 	"github.com/spf13/viper"
 
-	"github.com/drakkan/sftpgo/v2/acme"
-	"github.com/drakkan/sftpgo/v2/command"
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/ftpd"
-	"github.com/drakkan/sftpgo/v2/httpclient"
-	"github.com/drakkan/sftpgo/v2/httpd"
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/mfa"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/sftpd"
-	"github.com/drakkan/sftpgo/v2/smtp"
-	"github.com/drakkan/sftpgo/v2/telemetry"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/version"
-	"github.com/drakkan/sftpgo/v2/webdavd"
+	"github.com/drakkan/sftpgo/v2/internal/acme"
+	"github.com/drakkan/sftpgo/v2/internal/command"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/ftpd"
+	"github.com/drakkan/sftpgo/v2/internal/httpclient"
+	"github.com/drakkan/sftpgo/v2/internal/httpd"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/mfa"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/sftpd"
+	"github.com/drakkan/sftpgo/v2/internal/smtp"
+	"github.com/drakkan/sftpgo/v2/internal/telemetry"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/version"
+	"github.com/drakkan/sftpgo/v2/internal/webdavd"
 )
 
 const (

+ 0 - 0
config/config_linux.go → internal/config/config_linux.go


+ 0 - 0
config/config_nolinux.go → internal/config/config_nolinux.go


+ 16 - 37
config/config_test.go → internal/config/config_test.go

@@ -26,24 +26,28 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/drakkan/sftpgo/v2/command"
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/config"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/ftpd"
-	"github.com/drakkan/sftpgo/v2/httpclient"
-	"github.com/drakkan/sftpgo/v2/httpd"
-	"github.com/drakkan/sftpgo/v2/mfa"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/sftpd"
-	"github.com/drakkan/sftpgo/v2/smtp"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/command"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/config"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/ftpd"
+	"github.com/drakkan/sftpgo/v2/internal/httpclient"
+	"github.com/drakkan/sftpgo/v2/internal/httpd"
+	"github.com/drakkan/sftpgo/v2/internal/mfa"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/sftpd"
+	"github.com/drakkan/sftpgo/v2/internal/smtp"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 const (
 	tempConfigName = "temp"
 )
 
+var (
+	configDir = filepath.Join(".", "..", "..")
+)
+
 func reset() {
 	viper.Reset()
 	config.Init()
@@ -52,7 +56,6 @@ func reset() {
 func TestLoadConfigTest(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	assert.NotEqual(t, httpd.Conf{}, config.GetHTTPConfig())
@@ -89,7 +92,6 @@ func TestLoadConfigFileNotFound(t *testing.T) {
 func TestEmptyBanner(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	err := config.LoadConfig(configDir, "")
@@ -126,7 +128,6 @@ func TestEmptyBanner(t *testing.T) {
 func TestEnabledSSHCommands(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	err := config.LoadConfig(configDir, "")
@@ -155,7 +156,6 @@ func TestEnabledSSHCommands(t *testing.T) {
 func TestInvalidUploadMode(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	err := config.LoadConfig(configDir, "")
@@ -178,7 +178,6 @@ func TestInvalidUploadMode(t *testing.T) {
 func TestInvalidExternalAuthScope(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	err := config.LoadConfig(configDir, "")
@@ -201,7 +200,6 @@ func TestInvalidExternalAuthScope(t *testing.T) {
 func TestInvalidProxyProtocol(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	err := config.LoadConfig(configDir, "")
@@ -224,7 +222,6 @@ func TestInvalidProxyProtocol(t *testing.T) {
 func TestInvalidUsersBaseDir(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	err := config.LoadConfig(configDir, "")
@@ -247,7 +244,6 @@ func TestInvalidUsersBaseDir(t *testing.T) {
 func TestInvalidInstallationHint(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	err := config.LoadConfig(configDir, "")
@@ -278,7 +274,6 @@ func TestDefenderProviderDriver(t *testing.T) {
 	}
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	providerConf := config.GetProviderConf()
@@ -358,7 +353,6 @@ func TestSetGetConfig(t *testing.T) {
 func TestServiceToStart(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	assert.True(t, config.HasServicesToStart())
@@ -392,7 +386,6 @@ func TestSSHCommandsFromEnv(t *testing.T) {
 		os.Unsetenv("SFTPGO_SFTPD__ENABLED_SSH_COMMANDS")
 	})
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 
@@ -413,7 +406,6 @@ func TestSMTPFromEnv(t *testing.T) {
 		os.Unsetenv("SFTPGO_SMTP__PORT")
 	})
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	smtpConfig := config.GetSMTPConfig()
@@ -435,7 +427,6 @@ func TestMFAFromEnv(t *testing.T) {
 		os.Unsetenv("SFTPGO_MFA__TOTP__1__ALGO")
 	})
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	mfaConf := config.GetMFAConfig()
@@ -451,7 +442,6 @@ func TestMFAFromEnv(t *testing.T) {
 func TestDisabledMFAConfig(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 
@@ -491,7 +481,6 @@ func TestFTPDOverridesFromEnv(t *testing.T) {
 	}
 	t.Cleanup(cleanup)
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	ftpdConf := config.GetFTPDConfig()
@@ -552,7 +541,6 @@ func TestHTTPDSubObjectsFromEnv(t *testing.T) {
 	}
 	t.Cleanup(cleanup)
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	httpdConf := config.GetHTTPDConfig()
@@ -628,7 +616,6 @@ func TestPluginsFromEnv(t *testing.T) {
 		os.Unsetenv("SFTPGO_PLUGINS__0__AUTH_OPTIONS__SCOPE")
 	})
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	pluginsConf := config.GetPluginsConfig()
@@ -727,7 +714,6 @@ func TestRateLimitersFromEnv(t *testing.T) {
 		os.Unsetenv("SFTPGO_COMMON__RATE_LIMITERS__8__ALLOW_LIST")
 	})
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	limiters := config.GetCommonConfig().RateLimitersConfig
@@ -780,7 +766,6 @@ func TestSFTPDBindingsFromEnv(t *testing.T) {
 		os.Unsetenv("SFTPGO_SFTPD__BINDINGS__3__PORT")
 	})
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	bindings := config.GetSFTPDConfig().Bindings
@@ -796,7 +781,6 @@ func TestSFTPDBindingsFromEnv(t *testing.T) {
 func TestCommandsFromEnv(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	err := config.LoadConfig(configDir, "")
@@ -903,7 +887,6 @@ func TestFTPDBindingsFromEnv(t *testing.T) {
 		os.Unsetenv("SFTPGO_FTPD__BINDINGS__9__CERTIFICATE_KEY_FILE")
 	})
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	bindings := config.GetFTPDConfig().Bindings
@@ -979,7 +962,6 @@ func TestWebDAVBindingsFromEnv(t *testing.T) {
 		os.Unsetenv("SFTPGO_WEBDAVD__BINDINGS__2__CERTIFICATE_KEY_FILE")
 	})
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	bindings := config.GetWebDAVDConfig().Bindings
@@ -1152,7 +1134,6 @@ func TestHTTPDBindingsFromEnv(t *testing.T) {
 		os.Unsetenv("SFTPGO_HTTPD__BINDINGS__2__CERTIFICATE_KEY_FILE")
 	})
 
-	configDir := ".."
 	err := config.LoadConfig(configDir, "")
 	assert.NoError(t, err)
 	bindings := config.GetHTTPDConfig().Bindings
@@ -1260,7 +1241,6 @@ func TestHTTPDBindingsFromEnv(t *testing.T) {
 func TestHTTPClientCertificatesFromEnv(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	err := config.LoadConfig(configDir, "")
@@ -1321,7 +1301,6 @@ func TestHTTPClientCertificatesFromEnv(t *testing.T) {
 func TestHTTPClientHeadersFromEnv(t *testing.T) {
 	reset()
 
-	configDir := ".."
 	confName := tempConfigName + ".json"
 	configFilePath := filepath.Join(configDir, confName)
 	err := config.LoadConfig(configDir, "")

+ 5 - 5
dataprovider/actions.go → internal/dataprovider/actions.go

@@ -26,11 +26,11 @@ import (
 
 	"github.com/sftpgo/sdk/plugin/notifier"
 
-	"github.com/drakkan/sftpgo/v2/command"
-	"github.com/drakkan/sftpgo/v2/httpclient"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/command"
+	"github.com/drakkan/sftpgo/v2/internal/httpclient"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 const (

+ 4 - 4
dataprovider/admin.go → internal/dataprovider/admin.go

@@ -28,10 +28,10 @@ import (
 	passwordvalidator "github.com/wagslane/go-password-validator"
 	"golang.org/x/crypto/bcrypt"
 
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/mfa"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/mfa"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 // Available permissions for SFTPGo admins

+ 2 - 2
dataprovider/apikey.go → internal/dataprovider/apikey.go

@@ -23,8 +23,8 @@ import (
 	"github.com/alexedwards/argon2id"
 	"golang.org/x/crypto/bcrypt"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 // APIKeyScope defines the supported API key scopes

+ 4 - 4
dataprovider/bolt.go → internal/dataprovider/bolt.go

@@ -28,10 +28,10 @@ import (
 
 	bolt "go.etcd.io/bbolt"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/version"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/version"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (

+ 1 - 1
dataprovider/bolt_disabled.go → internal/dataprovider/bolt_disabled.go

@@ -20,7 +20,7 @@ package dataprovider
 import (
 	"errors"
 
-	"github.com/drakkan/sftpgo/v2/version"
+	"github.com/drakkan/sftpgo/v2/internal/version"
 )
 
 func init() {

+ 0 - 0
dataprovider/cachedpassword.go → internal/dataprovider/cachedpassword.go


+ 2 - 2
dataprovider/cacheduser.go → internal/dataprovider/cacheduser.go

@@ -20,8 +20,8 @@ import (
 
 	"golang.org/x/net/webdav"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 8 - 8
dataprovider/dataprovider.go → internal/dataprovider/dataprovider.go

@@ -61,14 +61,14 @@ import (
 	"golang.org/x/crypto/pbkdf2"
 	"golang.org/x/crypto/ssh"
 
-	"github.com/drakkan/sftpgo/v2/command"
-	"github.com/drakkan/sftpgo/v2/httpclient"
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/mfa"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/command"
+	"github.com/drakkan/sftpgo/v2/internal/httpclient"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/mfa"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (

+ 5 - 5
dataprovider/eventrule.go → internal/dataprovider/eventrule.go

@@ -32,11 +32,11 @@ import (
 
 	"github.com/robfig/cron/v3"
 
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/smtp"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/smtp"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 // Supported event actions

+ 3 - 3
dataprovider/eventruleutil.go → internal/dataprovider/eventruleutil.go

@@ -23,9 +23,9 @@ import (
 
 	"github.com/robfig/cron/v3"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 4 - 4
dataprovider/group.go → internal/dataprovider/group.go

@@ -22,10 +22,10 @@ import (
 
 	"github.com/sftpgo/sdk"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 // GroupUserSettings defines the settings to apply to users

+ 3 - 3
dataprovider/memory.go → internal/dataprovider/memory.go

@@ -24,9 +24,9 @@ import (
 	"sync"
 	"time"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 var (

+ 3 - 3
dataprovider/mysql.go → internal/dataprovider/mysql.go

@@ -30,9 +30,9 @@ import (
 
 	"github.com/go-sql-driver/mysql"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/version"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/version"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (

+ 1 - 1
dataprovider/mysql_disabled.go → internal/dataprovider/mysql_disabled.go

@@ -20,7 +20,7 @@ package dataprovider
 import (
 	"errors"
 
-	"github.com/drakkan/sftpgo/v2/version"
+	"github.com/drakkan/sftpgo/v2/internal/version"
 )
 
 func init() {

+ 3 - 3
dataprovider/pgsql.go → internal/dataprovider/pgsql.go

@@ -29,9 +29,9 @@ import (
 	// we import lib/pq here to be able to disable PostgreSQL support using a build tag
 	_ "github.com/lib/pq"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/version"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/version"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (

+ 1 - 1
dataprovider/pgsql_disabled.go → internal/dataprovider/pgsql_disabled.go

@@ -20,7 +20,7 @@ package dataprovider
 import (
 	"errors"
 
-	"github.com/drakkan/sftpgo/v2/version"
+	"github.com/drakkan/sftpgo/v2/internal/version"
 )
 
 func init() {

+ 1 - 1
dataprovider/quota.go → internal/dataprovider/quota.go

@@ -18,7 +18,7 @@ import (
 	"sync"
 	"time"
 
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 1 - 1
dataprovider/quotaupdater.go → internal/dataprovider/quotaupdater.go

@@ -18,7 +18,7 @@ import (
 	"sync"
 	"time"
 
-	"github.com/drakkan/sftpgo/v2/logger"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
 )
 
 var delayedQuotaUpdater quotaUpdater

+ 3 - 3
dataprovider/scheduler.go → internal/dataprovider/scheduler.go

@@ -21,9 +21,9 @@ import (
 
 	"github.com/robfig/cron/v3"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/metric"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/metric"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 var (

+ 0 - 0
dataprovider/session.go → internal/dataprovider/session.go


+ 2 - 2
dataprovider/share.go → internal/dataprovider/share.go

@@ -24,8 +24,8 @@ import (
 	"github.com/alexedwards/argon2id"
 	"golang.org/x/crypto/bcrypt"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 // ShareScope defines the supported share scopes

+ 3 - 3
dataprovider/sqlcommon.go → internal/dataprovider/sqlcommon.go

@@ -28,9 +28,9 @@ import (
 	"github.com/cockroachdb/cockroach-go/v2/crdb"
 	"github.com/sftpgo/sdk"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (

+ 4 - 4
dataprovider/sqlite.go → internal/dataprovider/sqlite.go

@@ -30,10 +30,10 @@ import (
 	// we import go-sqlite3 here to be able to disable SQLite support using a build tag
 	_ "github.com/mattn/go-sqlite3"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/version"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/version"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (

+ 1 - 1
dataprovider/sqlite_disabled.go → internal/dataprovider/sqlite_disabled.go

@@ -20,7 +20,7 @@ package dataprovider
 import (
 	"errors"
 
-	"github.com/drakkan/sftpgo/v2/version"
+	"github.com/drakkan/sftpgo/v2/internal/version"
 )
 
 func init() {

+ 1 - 1
dataprovider/sqlqueries.go → internal/dataprovider/sqlqueries.go

@@ -19,7 +19,7 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (

+ 6 - 6
dataprovider/user.go → internal/dataprovider/user.go

@@ -29,12 +29,12 @@ import (
 
 	"github.com/sftpgo/sdk"
 
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/mfa"
-	"github.com/drakkan/sftpgo/v2/plugin"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/mfa"
+	"github.com/drakkan/sftpgo/v2/internal/plugin"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 // Available permissions for SFTPGo users

+ 4 - 4
ftpd/cryptfs_test.go → internal/ftpd/cryptfs_test.go

@@ -30,10 +30,10 @@ import (
 	"github.com/sftpgo/sdk"
 	"github.com/stretchr/testify/assert"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/httpdtest"
-	"github.com/drakkan/sftpgo/v2/kms"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/httpdtest"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
 )
 
 func TestBasicFTPHandlingCryptFs(t *testing.T) {

+ 3 - 3
ftpd/ftpd.go → internal/ftpd/ftpd.go

@@ -24,9 +24,9 @@ import (
 
 	ftpserver "github.com/fclairamb/ftpserverlib"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 const (

+ 11 - 11
ftpd/ftpd_test.go → internal/ftpd/ftpd_test.go

@@ -45,16 +45,16 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/config"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/ftpd"
-	"github.com/drakkan/sftpgo/v2/httpdtest"
-	"github.com/drakkan/sftpgo/v2/kms"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/mfa"
-	"github.com/drakkan/sftpgo/v2/sftpd"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/config"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/ftpd"
+	"github.com/drakkan/sftpgo/v2/internal/httpdtest"
+	"github.com/drakkan/sftpgo/v2/internal/kms"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/mfa"
+	"github.com/drakkan/sftpgo/v2/internal/sftpd"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (
@@ -64,7 +64,6 @@ const (
 	ftpSrvAddrTLS   = "127.0.0.1:2124" // ftp server with implicit tls
 	defaultUsername = "test_user_ftp"
 	defaultPassword = "test_password"
-	configDir       = ".."
 	osWindows       = "windows"
 	ftpsCert        = `-----BEGIN CERTIFICATE-----
 MIICHTCCAaKgAwIBAgIUHnqw7QnB1Bj9oUsNpdb+ZkFPOxMwCgYIKoZIzj0EAwIw
@@ -249,6 +248,7 @@ XMf5HU3ThYqYn3bYypZZ8nQ7BXVh4LqGNqG29wR4v6l+dLO6odXnLzfApGD9e+d4
 )
 
 var (
+	configDir       = filepath.Join(".", "..", "..")
 	allPerms        = []string{dataprovider.PermAny}
 	homeBasePath    string
 	hookCmdPath     string

+ 4 - 4
ftpd/handler.go → internal/ftpd/handler.go

@@ -26,10 +26,10 @@ import (
 	ftpserver "github.com/fclairamb/ftpserverlib"
 	"github.com/spf13/afero"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 var (

+ 8 - 5
ftpd/internal_test.go → internal/ftpd/internal_test.go

@@ -34,14 +34,13 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 const (
-	configDir = ".."
-	ftpsCert  = `-----BEGIN CERTIFICATE-----
+	ftpsCert = `-----BEGIN CERTIFICATE-----
 MIICHTCCAaKgAwIBAgIUHnqw7QnB1Bj9oUsNpdb+ZkFPOxMwCgYIKoZIzj0EAwIw
 RTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu
 dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDAyMDQwOTUzMDRaFw0zMDAyMDEw
@@ -268,6 +267,10 @@ xr5cb9VBRBtB9aOKVfuRhpatAfS2Pzm2Htae9lFn7slGPUmu2hkjDw==
 -----END RSA PRIVATE KEY-----`
 )
 
+var (
+	configDir = filepath.Join(".", "..", "..")
+)
+
 type mockFTPClientContext struct {
 	lastDataChannel ftpserver.DataChannel
 	remoteIP        string

+ 6 - 6
ftpd/server.go → internal/ftpd/server.go

@@ -26,12 +26,12 @@ import (
 
 	ftpserver "github.com/fclairamb/ftpserverlib"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/metric"
-	"github.com/drakkan/sftpgo/v2/util"
-	"github.com/drakkan/sftpgo/v2/version"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/metric"
+	"github.com/drakkan/sftpgo/v2/internal/util"
+	"github.com/drakkan/sftpgo/v2/internal/version"
 )
 
 // Server implements the ftpserverlib MainDriver interface

+ 2 - 2
ftpd/transfer.go → internal/ftpd/transfer.go

@@ -21,8 +21,8 @@ import (
 
 	"github.com/eikenb/pipeat"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/vfs"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/vfs"
 )
 
 // transfer contains the transfer details for an upload or a download.

+ 2 - 2
httpclient/httpclient.go → internal/httpclient/httpclient.go

@@ -27,8 +27,8 @@ import (
 
 	"github.com/hashicorp/go-retryablehttp"
 
-	"github.com/drakkan/sftpgo/v2/logger"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/logger"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 // TLSKeyPair defines the paths for a TLS key pair

+ 3 - 3
httpd/api_admin.go → internal/httpd/api_admin.go

@@ -22,9 +22,9 @@ import (
 	"github.com/go-chi/jwtauth/v5"
 	"github.com/go-chi/render"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/smtp"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/smtp"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 func getAdmins(w http.ResponseWriter, r *http.Request) {

+ 2 - 2
httpd/api_defender.go → internal/httpd/api_defender.go

@@ -23,8 +23,8 @@ import (
 
 	"github.com/go-chi/render"
 
-	"github.com/drakkan/sftpgo/v2/common"
-	"github.com/drakkan/sftpgo/v2/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/common"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
 )
 
 func getDefenderHosts(w http.ResponseWriter, r *http.Request) {

+ 2 - 2
httpd/api_eventrule.go → internal/httpd/api_eventrule.go

@@ -20,8 +20,8 @@ import (
 
 	"github.com/go-chi/render"
 
-	"github.com/drakkan/sftpgo/v2/dataprovider"
-	"github.com/drakkan/sftpgo/v2/util"
+	"github.com/drakkan/sftpgo/v2/internal/dataprovider"
+	"github.com/drakkan/sftpgo/v2/internal/util"
 )
 
 func getEventActions(w http.ResponseWriter, r *http.Request) {

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác