[FIXED] Service import response invoking svc import (#3393)

past processing the import response, c.pa was not reset to the
appropriate state, which lead to an unintended recursion

Signed-off-by: Matthias Hanel <mh@synadia.com>
This commit is contained in:
Matthias Hanel
2022-08-23 16:22:46 -07:00
committed by GitHub
parent 36f443dcf8
commit eae3ffa859
2 changed files with 60 additions and 0 deletions

View File

@@ -2141,8 +2141,15 @@ func (a *Account) processServiceImportResponse(sub *subscription, c *client, _ *
}
a.mu.RUnlock()
old := c.pa.subject
if c.kind == CLIENT || c.kind == LEAF {
// reset state to prior to service invocation (code to reset c.pa.subject to old may not be necessary)
c.pa.subject = []byte(si.to)
}
// Send for normal processing.
c.processServiceImport(si, a, msg)
c.pa.subject = old
}
// Will create the response prefix for fast generation of responses.

View File

@@ -3524,3 +3524,56 @@ func TestAccountUserSubPermsWithQueueGroups(t *testing.T) {
// Expect no msgs.
checkSubsPending(t, qsub, 0)
}
func TestAccountImportCycle(t *testing.T) {
cf := createConfFile(t, []byte(`
port: -1
accounts: {
CP: {
users: [
{user: cp, password: cp},
],
exports: [
{service: "q1.>", response_type: Singleton},
{service: "q2.>", response_type: Singleton},
],
},
A: {
users: [
{user: a, password: a},
],
imports: [
{service: {account: CP, subject: "q1.>"}},
{service: {account: CP, subject: "q2.>"}},
]
},
}
`))
defer removeFile(t, cf)
s, _ := RunServerWithConfig(cf)
defer s.Shutdown()
ncCp, err := nats.Connect(s.ClientURL(), nats.UserInfo("cp", "cp"))
require_NoError(t, err)
defer ncCp.Close()
ncA, err := nats.Connect(s.ClientURL(), nats.UserInfo("a", "a"))
require_NoError(t, err)
defer ncA.Close()
// setup reply
subCp, err := ncCp.SubscribeSync("q1.>")
require_NoError(t, err)
// setup requestor and send reply
ib := "q2.inbox"
subAResp, err := ncA.SubscribeSync(ib)
require_NoError(t, err)
// send request
err = ncA.PublishRequest("q1.a", ib, []byte("test"))
require_NoError(t, err)
// reply
mReq, err := subCp.NextMsg(time.Second)
require_NoError(t, err)
err = mReq.Respond([]byte("reply"))
require_NoError(t, err)
mRep, err := subAResp.NextMsg(time.Second)
require_NoError(t, err)
require_Contains(t, string(mRep.Data), "reply")
}