forked from pydio/cells
-
Notifications
You must be signed in to change notification settings - Fork 0
/
modifiers.go
150 lines (120 loc) · 4.84 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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
* Copyright (c) 2019-2021. Abstrium SAS <team (at) pydio.com>
* This file is part of Pydio Cells.
*
* Pydio Cells is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pydio Cells is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Pydio Cells. If not, see <http://www.gnu.org/licenses/>.
*
* The latest code can be found at <https://pydio.com>.
*/
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
// BootConfModifier is a func type for dynamically filtering the content of the bootconf
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
}
// RegisterBootConfModifier appends a BootConfModifier to the list
func RegisterBootConfModifier(modifier BootConfModifier) {
bootConfModifiers = append(bootConfModifiers, modifier)
}
// ApplyBootConfModifiers 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
}
// WrapAuthMiddleware registers an additional auth middleware
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)
}
// ApplyAuthMiddlewares applies registered middlewares
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)
}