1
1
package http
2
2
3
3
import (
4
+ "files/pkg/drives"
5
+ "files/pkg/rpc"
4
6
"k8s.io/klog/v2"
5
7
"net/http"
6
8
"strconv"
@@ -15,12 +17,14 @@ type handleFunc func(w http.ResponseWriter, r *http.Request, d *common.Data) (in
15
17
16
18
func handle (fn handleFunc , prefix string , server * settings.Server ) http.Handler {
17
19
handler := http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
18
- if prefix == "/api/paste" || (prefix == "/api/resources" && r .Method == http .MethodPatch ) {
19
- klog .Warningf ("Is src and dst yours? We'll check it for %s %s" , r .Method , r .URL .Path )
20
- } else if prefix == "/api/resources" || prefix == "/api/raw" || prefix == "/api/preview" {
21
- klog .Warningf ("Is src yours? We'll check it for %s %s" , r .Method , r .URL .Path )
20
+ checked , err := CheckPathOwner (r , prefix )
21
+ if err != nil {
22
+ http .Error (w , err .Error (), http .StatusForbidden )
22
23
}
23
-
24
+ if ! checked {
25
+ http .Error (w , http .StatusText (http .StatusForbidden ), http .StatusForbidden )
26
+ }
27
+
24
28
w .Header ().Set ("Cache-Control" , "no-cache, no-store, must-revalidate" )
25
29
26
30
status , err := fn (w , r , & common.Data {
@@ -41,3 +45,54 @@ func handle(fn handleFunc, prefix string, server *settings.Server) http.Handler
41
45
42
46
return stripPrefix (prefix , handler )
43
47
}
48
+
49
+ func CheckPathOwner (r * http.Request , prefix string ) (bool , error ) {
50
+ if prefix != "/api/resources" && prefix != "/api/raw" && prefix != "/api/preview" && prefix != "/api/paste" {
51
+ return true , nil
52
+ }
53
+
54
+ var err error = nil
55
+ method := r .Method
56
+ src := r .URL .Path
57
+
58
+ srcType := r .URL .Query ().Get ("src_type" )
59
+ if srcType == "" {
60
+ srcType = r .URL .Query ().Get ("src" )
61
+ if srcType == "" {
62
+ srcType = drives .SrcTypeDrive
63
+ }
64
+ }
65
+
66
+ dst := r .URL .Query ().Get ("destination" )
67
+ dstType := r .URL .Query ().Get ("dst_type" )
68
+ if dstType == "" {
69
+ dstType = drives .SrcTypeDrive
70
+ }
71
+
72
+ klog .Infof ("Checking owner for method: %s, prefix: %s, srcType: %s, src: %s, dstType: %s, dst: %s" , method , prefix , srcType , src , dstType , dst )
73
+
74
+ bflRequest := r .Header .Get ("X-Bfl-User" )
75
+ bflParsed := ""
76
+ if drives .IsBaseDrives (srcType ) {
77
+ bflParsed , err = rpc .PVCs .GetBfl (rpc .ExtractPvcFromURL (src ))
78
+ if err != nil {
79
+ return false , err
80
+ }
81
+ if bflParsed != bflRequest {
82
+ return false , nil
83
+ }
84
+ }
85
+
86
+ if prefix == "/api/paste" || (prefix == "/api/resources" && r .Method == http .MethodPatch ) {
87
+ if drives .IsBaseDrives (dstType ) {
88
+ bflParsed , err = rpc .PVCs .GetBfl (rpc .ExtractPvcFromURL (dst ))
89
+ if err != nil {
90
+ return false , err
91
+ }
92
+ if bflParsed != bflRequest {
93
+ return false , nil
94
+ }
95
+ }
96
+ }
97
+ return true , nil
98
+ }
0 commit comments