5
5
"fmt"
6
6
"io/fs"
7
7
"net/http"
8
+ "net/url"
8
9
"strings"
9
10
10
11
"github.com/cgi-fr/pimo/pkg/jsonline"
@@ -17,7 +18,7 @@ import (
17
18
//go:embed client
18
19
var content embed.FS
19
20
20
- func Play () * echo.Echo {
21
+ func Play (enableSecurity bool ) * echo.Echo {
21
22
router := echo .New ()
22
23
23
24
router .Use (middleware .CORS ())
@@ -26,6 +27,15 @@ func Play() *echo.Echo {
26
27
" err=${error}\n " ,
27
28
}))
28
29
30
+ if enableSecurity {
31
+ router .Use (func (next echo.HandlerFunc ) echo.HandlerFunc {
32
+ return func (c echo.Context ) error {
33
+ c .Set ("enableSecurity" , true )
34
+ return next (c )
35
+ }
36
+ })
37
+ }
38
+
29
39
router .GET ("/*" , echo .WrapHandler (handleClient ()))
30
40
router .POST ("/play" , play )
31
41
@@ -70,6 +80,13 @@ func play(ctx echo.Context) error {
70
80
return ctx .String (http .StatusInternalServerError , err .Error ())
71
81
}
72
82
83
+ if ctx .Get ("enableSecurity" ) == true {
84
+ if err := checkSecurityRequirements (pdef ); err != nil {
85
+ log .Err (err ).Msg ("Forbidden request" )
86
+ return ctx .String (http .StatusInternalServerError , err .Error ())
87
+ }
88
+ }
89
+
73
90
config .SingleInput = & input
74
91
context := NewContext (pdef )
75
92
@@ -90,6 +107,47 @@ func play(ctx echo.Context) error {
90
107
return ctx .JSONBlob (http .StatusOK , []byte (result .String ()))
91
108
}
92
109
110
+ func checkSecurityRequirements (pdef model.Definition ) error {
111
+ for _ , mask := range pdef .Masking {
112
+ // usage of command is not allowed with pimo play
113
+ if len (mask .Mask .Command ) > 0 {
114
+ return fmt .Errorf ("Usage of `command` mask is forbidden" )
115
+ }
116
+
117
+ // usage of file scheme is not allowed
118
+ if err := checkUriScheme (mask .Mask .FluxURI ); err != nil {
119
+ return err
120
+ }
121
+
122
+ if err := checkUriScheme (mask .Mask .HashInURI ); err != nil {
123
+ return err
124
+ }
125
+
126
+ if err := checkUriScheme (mask .Mask .Markov .Sample ); err != nil {
127
+ return err
128
+ }
129
+
130
+ if err := checkUriScheme (mask .Mask .RandomChoiceInURI ); err != nil {
131
+ return err
132
+ }
133
+ }
134
+
135
+ return nil
136
+ }
137
+
138
+ func checkUriScheme (uri string ) error {
139
+ u , err := url .Parse (uri )
140
+ if err != nil {
141
+ return nil
142
+ }
143
+
144
+ if u .Scheme == "file" {
145
+ return fmt .Errorf ("Usage of `file` scheme is forbidden" )
146
+ }
147
+
148
+ return nil
149
+ }
150
+
93
151
func handleClient () http.Handler {
94
152
fSys , err := fs .Sub (content , "client" )
95
153
if err != nil {
0 commit comments