@@ -36,6 +36,20 @@ type Options struct {
36
36
EndPort int64 `usage:"-"`
37
37
CredentialOverride string `usage:"-"`
38
38
Sequential bool `usage:"-"`
39
+ Authorizer AuthorizerFunc `usage:"-"`
40
+ }
41
+
42
+ type AuthorizerResponse struct {
43
+ Accept bool
44
+ Message string
45
+ }
46
+
47
+ type AuthorizerFunc func (ctx engine.Context , input string ) (AuthorizerResponse , error )
48
+
49
+ func DefaultAuthorizer (ctx engine.Context , input string ) (AuthorizerResponse , error ) {
50
+ return AuthorizerResponse {
51
+ Accept : true ,
52
+ }, nil
39
53
}
40
54
41
55
func complete (opts ... Options ) (result Options ) {
@@ -46,6 +60,9 @@ func complete(opts ...Options) (result Options) {
46
60
result .EndPort = types .FirstSet (opt .EndPort , result .EndPort )
47
61
result .CredentialOverride = types .FirstSet (opt .CredentialOverride , result .CredentialOverride )
48
62
result .Sequential = types .FirstSet (opt .Sequential , result .Sequential )
63
+ if opt .Authorizer != nil {
64
+ result .Authorizer = opt .Authorizer
65
+ }
49
66
}
50
67
if result .MonitorFactory == nil {
51
68
result .MonitorFactory = noopFactory {}
@@ -56,11 +73,15 @@ func complete(opts ...Options) (result Options) {
56
73
if result .StartPort == 0 {
57
74
result .StartPort = result .EndPort
58
75
}
76
+ if result .Authorizer == nil {
77
+ result .Authorizer = DefaultAuthorizer
78
+ }
59
79
return
60
80
}
61
81
62
82
type Runner struct {
63
83
c engine.Model
84
+ auth AuthorizerFunc
64
85
factory MonitorFactory
65
86
runtimeManager engine.RuntimeManager
66
87
ports engine.Ports
@@ -81,6 +102,7 @@ func New(client engine.Model, credCtx string, opts ...Options) (*Runner, error)
81
102
credMutex : sync.Mutex {},
82
103
credOverrides : opt .CredentialOverride ,
83
104
sequential : opt .Sequential ,
105
+ auth : opt .Authorizer ,
84
106
}
85
107
86
108
if opt .StartPort != 0 {
@@ -405,6 +427,20 @@ func (r *Runner) start(callCtx engine.Context, state *State, monitor Monitor, en
405
427
406
428
callCtx .Ctx = context2 .AddPauseFuncToCtx (callCtx .Ctx , monitor .Pause )
407
429
430
+ authResp , err := r .auth (callCtx , input )
431
+ if err != nil {
432
+ return nil , err
433
+ }
434
+
435
+ if ! authResp .Accept {
436
+ msg := fmt .Sprintf ("[CALL REJECTED]: %s" , authResp .Message )
437
+ return & State {
438
+ Continuation : & engine.Return {
439
+ Result : & msg ,
440
+ },
441
+ }, nil
442
+ }
443
+
408
444
ret , err := e .Start (callCtx , input )
409
445
if err != nil {
410
446
return nil , err
0 commit comments