Skip to content

Commit 5230bf4

Browse files
committed
feat(drivers): add ProtonDrive driver
- Implement complete ProtonDrive storage driver with end-to-end encryption support - Add authentication via username/password with credential caching and reusable login - Support all core operations: List, Link, Put, Copy, Move, Remove, Rename, MakeDir - Include encrypted file operations with PGP key management and node passphrase handling - Add temporary HTTP server for secure file downloads with range request support - Support media streaming using temp server range requests - Implement progress tracking for uploads and downloads - Support directory operations with circular move detection - Add proper error handling and panic recovery for external library integration Closes #9312
2 parents 1e0e498 + 4f8bc47 commit 5230bf4

File tree

4 files changed

+27
-29
lines changed

4 files changed

+27
-29
lines changed

drivers/local/driver.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,14 @@ func (d *Local) FileInfoToObj(ctx context.Context, f fs.FileInfo, reqPath string
146146
thumb += "?type=thumb&sign=" + sign.Sign(stdpath.Join(reqPath, f.Name()))
147147
}
148148
}
149-
isFolder := f.IsDir() || isSymlinkDir(f, fullPath)
149+
filePath := filepath.Join(fullPath, f.Name())
150+
isFolder := f.IsDir() || isLinkedDir(f, filePath)
150151
var size int64
151152
if !isFolder {
152153
size = f.Size()
153154
}
154155
var ctime time.Time
155-
t, err := times.Stat(stdpath.Join(fullPath, f.Name()))
156+
t, err := times.Stat(filePath)
156157
if err == nil {
157158
if t.HasBirthTime() {
158159
ctime = t.BirthTime()
@@ -161,7 +162,7 @@ func (d *Local) FileInfoToObj(ctx context.Context, f fs.FileInfo, reqPath string
161162

162163
file := model.ObjThumb{
163164
Object: model.Object{
164-
Path: filepath.Join(fullPath, f.Name()),
165+
Path: filePath,
165166
Name: f.Name(),
166167
Modified: f.ModTime(),
167168
Size: size,
@@ -197,7 +198,7 @@ func (d *Local) Get(ctx context.Context, path string) (model.Obj, error) {
197198
}
198199
return nil, err
199200
}
200-
isFolder := f.IsDir() || isSymlinkDir(f, path)
201+
isFolder := f.IsDir() || isLinkedDir(f, path)
201202
size := f.Size()
202203
if isFolder {
203204
size = 0

drivers/local/util.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"io/fs"
88
"os"
99
"path/filepath"
10+
"runtime"
1011
"sort"
1112
"strconv"
1213
"strings"
@@ -18,14 +19,18 @@ import (
1819
ffmpeg "github.com/u2takey/ffmpeg-go"
1920
)
2021

21-
func isSymlinkDir(f fs.FileInfo, path string) bool {
22-
if f.Mode()&os.ModeSymlink == os.ModeSymlink {
23-
dst, err := os.Readlink(filepath.Join(path, f.Name()))
22+
func isLinkedDir(f fs.FileInfo, path string) bool {
23+
if f.Mode()&os.ModeSymlink == os.ModeSymlink || (runtime.GOOS == "windows" && f.Mode()&os.ModeIrregular != 0) {
24+
dst, err := os.Readlink(path)
2425
if err != nil {
2526
return false
2627
}
2728
if !filepath.IsAbs(dst) {
28-
dst = filepath.Join(path, dst)
29+
dst = filepath.Join(filepath.Dir(path), dst)
30+
}
31+
dst, err = filepath.Abs(dst)
32+
if err != nil {
33+
return false
2934
}
3035
stat, err := os.Stat(dst)
3136
if err != nil {

go.mod

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ require (
77
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0
88
github.com/KirCute/ftpserverlib-pasvportmap v1.25.0
99
github.com/KirCute/sftpd-alist v0.0.12
10-
github.com/ProtonMail/go-crypto v1.0.0
10+
github.com/ProtonMail/go-crypto v1.3.0
1111
github.com/SheltonZhu/115driver v1.1.2
1212
github.com/Xhofe/go-cache v0.0.0-20240804043513-b1a71927bc21
1313
github.com/Xhofe/rateg v0.0.0-20230728072201-251a4e1adad4
@@ -83,11 +83,10 @@ require (
8383

8484
require (
8585
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
86-
github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf
87-
github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e
88-
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f
89-
github.com/ProtonMail/go-srp v0.0.7
90-
github.com/ProtonMail/gopenpgp/v2 v2.7.4 // indirect
86+
github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf // indirect
87+
github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e // indirect
88+
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect
89+
github.com/ProtonMail/go-srp v0.0.7 // indirect
9190
github.com/PuerkitoBio/goquery v1.8.1 // indirect
9291
github.com/andybalholm/cascadia v1.3.2 // indirect
9392
github.com/bradenaw/juniper v0.15.2 // indirect
@@ -110,7 +109,7 @@ require (
110109
github.com/bytedance/sonic/loader v0.1.1 // indirect
111110
github.com/charmbracelet/x/ansi v0.2.3 // indirect
112111
github.com/charmbracelet/x/term v0.2.0 // indirect
113-
github.com/cloudflare/circl v1.3.7 // indirect
112+
github.com/cloudflare/circl v1.6.0 // indirect
114113
github.com/cloudwego/base64x v0.1.4 // indirect
115114
github.com/cloudwego/iasm v0.2.0 // indirect
116115
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect
@@ -138,6 +137,7 @@ require (
138137

139138
require (
140139
github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd // indirect
140+
github.com/ProtonMail/gopenpgp/v2 v2.9.0
141141
github.com/RoaringBitmap/roaring v1.9.3 // indirect
142142
github.com/abbot/go-http-auth v0.4.0 // indirect
143143
github.com/aead/ecdh v0.2.0 // indirect
@@ -282,7 +282,4 @@ require (
282282
lukechampine.com/blake3 v1.1.7 // indirect
283283
)
284284

285-
//ProtonDrive
286-
replace github.com/ProtonMail/go-proton-api => github.com/henrybear327/go-proton-api v0.0.0-20250127204557-9ee38cb0a689
287-
288285
replace github.com/SheltonZhu/115driver => github.com/okatu-loli/115driver v1.1.2

go.sum

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,16 @@ github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf/go.mod h1:o0ESU9
4646
github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e h1:lCsqUUACrcMC83lg5rTo9Y0PnPItE61JSfvMyIcANwk=
4747
github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo=
4848
github.com/ProtonMail/go-crypto v0.0.0-20230321155629-9a39f2531310/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE=
49-
github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
5049
github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
5150
github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
52-
github.com/ProtonMail/go-crypto v1.1.4-proton h1:KIo9uNlk3vzlwI7o5VjhiEjI4Ld1TDixOMnoNZyfpFE=
53-
github.com/ProtonMail/go-crypto v1.1.4-proton/go.mod h1:zNoyBJW3p/yVWiHNZgfTF9VsjwqYof5YY0M9kt2QaX0=
51+
github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw=
52+
github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE=
5453
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k=
5554
github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw=
5655
github.com/ProtonMail/go-srp v0.0.7 h1:Sos3Qk+th4tQR64vsxGIxYpN3rdnG9Wf9K4ZloC1JrI=
5756
github.com/ProtonMail/go-srp v0.0.7/go.mod h1:giCp+7qRnMIcCvI6V6U3S1lDDXDQYx2ewJ6F/9wdlJk=
58-
github.com/ProtonMail/gopenpgp/v2 v2.7.4 h1:Vz/8+HViFFnf2A6XX8JOvZMrA6F5puwNvvF21O1mRlo=
59-
github.com/ProtonMail/gopenpgp/v2 v2.7.4/go.mod h1:IhkNEDaxec6NyzSI0PlxapinnwPVIESk8/76da3Ct3g=
57+
github.com/ProtonMail/gopenpgp/v2 v2.9.0 h1:ruLzBmwe4dR1hdnrsEJ/S7psSBmV15gFttFUPP/+/kE=
58+
github.com/ProtonMail/gopenpgp/v2 v2.9.0/go.mod h1:IldDyh9Hv1ZCCYatTuuEt1XZJ0OPjxLpTarDfglih7s=
6059
github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM=
6160
github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ=
6261
github.com/RoaringBitmap/roaring v1.9.3 h1:t4EbC5qQwnisr5PrP9nt0IRhRTb9gMUgQF4t4S2OByM=
@@ -189,8 +188,8 @@ github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtM
189188
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
190189
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
191190
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
192-
github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys=
193-
github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
191+
github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk=
192+
github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
194193
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
195194
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
196195
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
@@ -373,8 +372,6 @@ github.com/hekmon/transmissionrpc/v3 v3.0.0 h1:0Fb11qE0IBh4V4GlOwHNYpqpjcYDp5Gou
373372
github.com/hekmon/transmissionrpc/v3 v3.0.0/go.mod h1:38SlNhFzinVUuY87wGj3acOmRxeYZAZfrj6Re7UgCDg=
374373
github.com/henrybear327/Proton-API-Bridge v1.0.0 h1:gjKAaWfKu++77WsZTHg6FUyPC5W0LTKWQciUm8PMZb0=
375374
github.com/henrybear327/Proton-API-Bridge v1.0.0/go.mod h1:gunH16hf6U74W2b9CGDaWRadiLICsoJ6KRkSt53zLts=
376-
github.com/henrybear327/go-proton-api v0.0.0-20250127204557-9ee38cb0a689 h1:mlMIj54+Vk509/Ye4T3TXm5u6gxIN5nAo3K8b6pzbNY=
377-
github.com/henrybear327/go-proton-api v0.0.0-20250127204557-9ee38cb0a689/go.mod h1:EKBccZlmQyQR17dyhm2OPQd5eyIbfddVXsoeCB474eo=
378375
github.com/henrybear327/go-proton-api v1.0.0 h1:zYi/IbjLwFAW7ltCeqXneUGJey0TN//Xo851a/BgLXw=
379376
github.com/henrybear327/go-proton-api v1.0.0/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMXYafI8H74D77AxytOBc=
380377
github.com/hirochachacha/go-smb2 v1.1.0 h1:b6hs9qKIql9eVXAiN0M2wSFY5xnhbHAQoCwRKbaRTZI=
@@ -684,8 +681,6 @@ github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo
684681
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
685682
github.com/zzzhr1990/go-common-entity v0.0.0-20221216044934-fd1c571e3a22 h1:X+lHsNTlbatQ1cErXIbtyrh+3MTWxqQFS+sBP/wpFXo=
686683
github.com/zzzhr1990/go-common-entity v0.0.0-20221216044934-fd1c571e3a22/go.mod h1:1zGRDJd8zlG6P8azG96+uywfh6udYWwhOmUivw+xsuM=
687-
gitlab.com/c0b/go-ordered-json v0.0.0-20201030195603-febf46534d5a h1:DxppxFKRqJ8WD6oJ3+ZXKDY0iMONQDl5UTg2aTyHh8k=
688-
gitlab.com/c0b/go-ordered-json v0.0.0-20201030195603-febf46534d5a/go.mod h1:NREvu3a57BaK0R1+ztrEzHWiZAihohNLQ6trPxlIqZI=
689684
go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA=
690685
go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
691686
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=

0 commit comments

Comments
 (0)