@@ -95,6 +95,9 @@ type Context interface {
95
95
type sshContext struct {
96
96
ctx context.Context
97
97
mtx * sync.RWMutex
98
+
99
+ values map [interface {}]interface {}
100
+ valuesMu sync.Mutex
98
101
}
99
102
100
103
var _ context.Context = & sshContext {}
@@ -103,7 +106,11 @@ var _ sync.Locker = &sshContext{}
103
106
104
107
func newContext (srv * Server ) (* sshContext , context.CancelFunc ) {
105
108
innerCtx , cancel := context .WithCancel (context .Background ())
106
- ctx := & sshContext {innerCtx , & sync.RWMutex {}}
109
+ ctx := & sshContext {
110
+ ctx : innerCtx ,
111
+ mtx : & sync.RWMutex {},
112
+ values : make (map [interface {}]interface {}),
113
+ }
107
114
ctx .SetValue (ContextKeyServer , srv )
108
115
perms := & Permissions {& gossh.Permissions {}}
109
116
ctx .SetValue (ContextKeyPermissions , perms )
@@ -124,18 +131,21 @@ func applyConnMetadata(ctx Context, conn gossh.ConnMetadata) {
124
131
ctx .SetValue (ContextKeyRemoteAddr , conn .RemoteAddr ())
125
132
}
126
133
127
- func (ctx * sshContext ) SetValue (key , value interface {}) {
128
- ctx .mtx .Lock ()
129
- defer ctx .mtx .Unlock ()
130
- ctx .ctx = context .WithValue (ctx .ctx , key , value )
131
- }
132
-
133
134
func (ctx * sshContext ) Value (key interface {}) interface {} {
134
- ctx .mtx .RLock ()
135
- defer ctx .mtx .RUnlock ()
135
+ ctx .valuesMu .Lock ()
136
+ defer ctx .valuesMu .Unlock ()
137
+ if v , ok := ctx .values [key ]; ok {
138
+ return v
139
+ }
136
140
return ctx .ctx .Value (key )
137
141
}
138
142
143
+ func (ctx * sshContext ) SetValue (key , value interface {}) {
144
+ ctx .valuesMu .Lock ()
145
+ defer ctx .valuesMu .Unlock ()
146
+ ctx .values [key ] = value
147
+ }
148
+
139
149
func (ctx * sshContext ) Done () <- chan struct {} {
140
150
ctx .mtx .RLock ()
141
151
defer ctx .mtx .RUnlock ()
0 commit comments