1
+ package auth_provider_manager
2
+
3
+ import (
4
+ "fmt"
5
+ "regexp"
6
+ "sync"
7
+ )
8
+
9
+ var authProviderMgrInstance AuthProviderManager
10
+
11
+ type AuthProviderManager interface {
12
+ GetRESTAuthProvider (uri string ) (* RESTAuthProvider , error )
13
+ GetSTOMPAuthProvider () (* STOMPAuthProvider , error )
14
+ SetRESTAuthProvider (regex * regexp.Regexp , provider * RESTAuthProvider ) int
15
+ SetSTOMPAuthProvider (provider * STOMPAuthProvider ) error
16
+ DeleteRESTAuthProvider (idx int ) error
17
+ DeleteSTOMPAuthProvider () error
18
+ }
19
+
20
+ type regexpRESTAuthProviderPair struct {
21
+ regexp * regexp.Regexp
22
+ restAuthProvider * RESTAuthProvider
23
+ }
24
+
25
+ type authProviderManager struct {
26
+ stompAuthProvider * STOMPAuthProvider
27
+ uriPatternRestAuthProviderPairs []* regexpRESTAuthProviderPair
28
+ mu sync.Mutex
29
+ }
30
+
31
+ type AuthProviderNotFoundError struct {}
32
+
33
+ func (e * AuthProviderNotFoundError ) Error () string {
34
+ return fmt .Sprintf ("no auth provider was found at the given location/name" )
35
+ }
36
+
37
+ type AuthError struct {
38
+ Code int
39
+ Message string
40
+ }
41
+ func (e * AuthError ) Error () string {
42
+ return fmt .Sprintf ("authentication/authorization error (%d): %s" , e .Code , e .Message )
43
+ }
44
+
45
+ func (a * authProviderManager ) GetRESTAuthProvider (uri string ) (* RESTAuthProvider , error ) {
46
+ a .mu .Lock ()
47
+ defer a .mu .Unlock ()
48
+
49
+ // perform regex tests to find the first matching REST auth provider
50
+ for _ , pair := range a .uriPatternRestAuthProviderPairs {
51
+ if pair .regexp .Match ([]byte (uri )) {
52
+ return pair .restAuthProvider , nil
53
+ }
54
+ }
55
+ return nil , & AuthProviderNotFoundError {}
56
+ }
57
+
58
+ func (a * authProviderManager ) GetSTOMPAuthProvider () (* STOMPAuthProvider , error ) {
59
+ a .mu .Lock ()
60
+ defer a .mu .Unlock ()
61
+ if a .stompAuthProvider == nil {
62
+ return nil , & AuthProviderNotFoundError {}
63
+ }
64
+ return a .stompAuthProvider , nil
65
+ }
66
+
67
+ func (a * authProviderManager ) SetRESTAuthProvider (regex * regexp.Regexp , provider * RESTAuthProvider ) int {
68
+ a .mu .Lock ()
69
+ defer a .mu .Unlock ()
70
+ a .uriPatternRestAuthProviderPairs = append (a .uriPatternRestAuthProviderPairs , & regexpRESTAuthProviderPair {
71
+ regexp : regex ,
72
+ restAuthProvider : provider ,
73
+ })
74
+
75
+ return len (a .uriPatternRestAuthProviderPairs )- 1
76
+ }
77
+
78
+ func (a * authProviderManager ) SetSTOMPAuthProvider (provider * STOMPAuthProvider ) error {
79
+ a .mu .Lock ()
80
+ defer a .mu .Unlock ()
81
+ a .stompAuthProvider = provider
82
+ return nil
83
+ }
84
+
85
+ func (a * authProviderManager ) DeleteRESTAuthProvider (idx int ) error {
86
+ a .mu .Lock ()
87
+ defer a .mu .Unlock ()
88
+ if idx < 0 || idx > len (a .uriPatternRestAuthProviderPairs )- 1 {
89
+ return fmt .Errorf ("no REST auth provider exists at index %d" , idx )
90
+ }
91
+ borderLeft := idx
92
+ borderRight := idx + 1
93
+ if idx > 0 {
94
+ borderLeft --
95
+ }
96
+ a .uriPatternRestAuthProviderPairs = append (a .uriPatternRestAuthProviderPairs [:borderLeft ], a .uriPatternRestAuthProviderPairs [borderRight :]... )
97
+ return nil
98
+ }
99
+
100
+ func (a * authProviderManager ) DeleteSTOMPAuthProvider () error {
101
+ a .mu .Lock ()
102
+ defer a .mu .Unlock ()
103
+ a .stompAuthProvider = nil
104
+ return nil
105
+ }
106
+
107
+ func GetAuthProviderManager () AuthProviderManager {
108
+ if authProviderMgrInstance == nil {
109
+ authProviderMgrInstance = & authProviderManager {}
110
+ }
111
+ return authProviderMgrInstance
112
+ }
113
+
114
+ func DestroyAuthProviderManager () {
115
+ authProviderMgrInstance = nil
116
+ }
0 commit comments