forked from pydio/cells
-
Notifications
You must be signed in to change notification settings - Fork 0
/
modifiers.go
129 lines (100 loc) · 3.96 KB
/
modifiers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package frontend
import (
"context"
"github.com/emicklei/go-restful"
"github.com/gorilla/sessions"
"github.com/pydio/cells/common/proto/rest"
)
// RegistryModifier is a func type for dynamically filtering output of the registry
type RegistryModifier func(ctx context.Context, status RequestStatus, registry *Cpydio_registry) error
// PluginModifier is a func type for dynamically filtering the content of a plugin (e.g enabled/disabled),
// based on the current status
type PluginModifier func(ctx context.Context, status RequestStatus, plugin Plugin) error
// PluginModifier is a func type for dynamically filtering the content of a plugin (e.g enabled/disabled),
// based on the current status
type BootConfModifier func(bootConf *BootConf) error
type EnrollMiddlewareFunc func(req *restful.Request, rsp *restful.Response, inputRequest *rest.FrontEnrollAuthRequest) bool
type FrontMiddleware struct {
Endpoint string
Middleware EnrollMiddlewareFunc
}
type AuthMiddleware func(req *restful.Request, rsp *restful.Response, in *rest.FrontSessionRequest, out *rest.FrontSessionResponse, session *sessions.Session) error
var (
pluginsModifier []PluginModifier
bootConfModifiers []BootConfModifier
modifiers []RegistryModifier
enrollMiddlewares []FrontMiddleware
authMiddlewares AuthMiddleware
)
// RegisterRegModifier appends a RegistryModifier to the list
func RegisterRegModifier(modifier RegistryModifier) {
modifiers = append(modifiers, modifier)
}
// ApplyRegModifiers can filter the output of registry before sending, based on status
func ApplyRegModifiers(ctx context.Context, status RequestStatus, registry *Cpydio_registry) error {
for _, m := range modifiers {
if e := m(ctx, status, registry); e != nil {
return e
}
}
return nil
}
// RegisterPluginModifier appends a PluginModifier to the list
func RegisterPluginModifier(modifier PluginModifier) {
pluginsModifier = append(pluginsModifier, modifier)
}
// ApplyPluginModifiers is called to apply all registered modifiers on a given plugin
func ApplyPluginModifiers(ctx context.Context, status RequestStatus, plugin Plugin) error {
for _, m := range pluginsModifier {
if e := m(ctx, status, plugin); e != nil {
return e
}
}
return nil
}
// RegisterPluginModifier appends a BootConfModifier to the list
func RegisterBootConfModifier(modifier BootConfModifier) {
bootConfModifiers = append(bootConfModifiers, modifier)
}
// ApplyPluginModifiers is called to apply all registered modifiers on the boot configuration
func ApplyBootConfModifiers(bootConf *BootConf) error {
for _, m := range bootConfModifiers {
if e := m(bootConf); e != nil {
return e
}
}
return nil
}
// RegisterEnrollMiddleware registers a middleware for a given endpoint
func RegisterEnrollMiddleware(endpoint string, middleware EnrollMiddlewareFunc) {
enrollMiddlewares = append(enrollMiddlewares, FrontMiddleware{
Endpoint: endpoint,
Middleware: middleware,
})
}
// ApplyEnrollMiddlewares goes through registered middlewares if there are any for the current endpoint
func ApplyEnrollMiddlewares(endpoint string, req *restful.Request, rsp *restful.Response) bool {
var request rest.FrontEnrollAuthRequest
req.ReadEntity(&request)
for _, m := range enrollMiddlewares {
if m.Endpoint != endpoint {
continue
}
if breakNow := m.Middleware(req, rsp, &request); breakNow {
return true
}
}
return false
}
func WrapAuthMiddleware(middleware func(middleware AuthMiddleware) AuthMiddleware) {
if authMiddlewares == nil {
// First register, create a noop middleware
authMiddlewares = func(req *restful.Request, rsp *restful.Response, in *rest.FrontSessionRequest, out *rest.FrontSessionResponse, session *sessions.Session) error {
return nil
}
}
authMiddlewares = middleware(authMiddlewares)
}
func ApplyAuthMiddlewares(req *restful.Request, rsp *restful.Response, in *rest.FrontSessionRequest, out *rest.FrontSessionResponse, session *sessions.Session) error {
return authMiddlewares(req, rsp, in, out, session)
}