[ https://issues.apache.org/jira/browse/PROTON-1718?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16301860#comment-16301860 ]
Tim Taylor edited comment on PROTON-1718 at 12/22/17 7:32 PM: -------------------------------------------------------------- Actually, after doing some digging, I suspect that I don't need to submit a PR to achieve this functionality. If I understand the Sasl APIs correctly, I should be able to use the combination of send(...)/recv(...)/pending() to manually send inits, wait for challenges, receive those challenges, and send my custom responses to meet the challenges. I can't seem to make it work, however. I can successfully send the init frame and am given a challenge frame in response. I can read that challenge frame just fine and can expose it to my application just fine. However, when I try to send a response to that first challenge, the frame I am trying to send is never written. It is saved as the challenge response, but it is never processed beyond that. Is the below code expected to work? Sasl sasl = transport.sasl(); sasl.client(); sasl.setMechanisms("<custom sasl mechanism>"); //send init message, wait for response sasl.send(<init payload>, 0, <init payload length>); waitForSaslBuffer(sasl); //receive first challenge, send first challenge response, wait for second challenge byte[] firstChallengeBytes = retrieveChallengeData(sasl); sasl.send(<challenge response payload>, 0, <challenge response payload length>); waitForSaslBuffer(sasl); //receive second challenge, send second challenge response byte[] secondChallengeBytes = retrieveChallengeData(sasl); sasl.send(<challenge response 2 payload>, 0, <challenge response 2 payload>); ... private void waitForSaslBuffer(Sasl sasl) { while (sasl.pending() == 0) { Thread.sleep(1000); } } private byte[] retrieveChallengeData(Sasl sasl) { byte[] saslChallengeBytes = new byte[sasl.pending()]; sasl.recv(saslChallengeBytes, 0, sasl.pending()); return saslChallengeBytes; } was (Author: timtay): Actually, after doing some digging, I suspect that I don't need to submit a PR to achieve this functionality. If I understand the Sasl APIs correctly, I should be able to use the combination of send(...)/recv(...)/pending() to manually send inits, wait for challenges, receive those challenges, and send my custom responses to meet the challenges. I can't seem to make it work, however. I can successfully send the init frame and am given a challenge frame in response. I can read that challenge frame just fine and can expose it to my application just fine. However, when I try to send a response to that first challenge, the frame I am trying to send is never written. It is saved as the challenge response, but it is never processed beyond that. Is the below code expected to work? Sasl sasl = transport.sasl(); sasl.client(); sasl.setMechanisms("<custom sasl mechanism>"); //send init message, wait for response sasl.send(<init payload>, 0, <init payload length>); waitForSaslBuffer(sasl); //receive first challenge, send first challenge response, wait for second challenge byte[] firstChallengeBytes = retrieveChallengeData(sasl); sasl.send(<challenge response payload>, 0, <challenge response payload length>); waitForSaslBuffer(sasl); //receive second challenge, send second challenge response byte[] secondChallengeBytes = retrieveChallengeData(sasl); sasl.send(<challenge response 2 payload>, 0, <challenge response 2 payload>); ... private void waitForSaslBuffer(Sasl sasl) { private void waitForSaslBuffer(Sasl sasl) { while (sasl.pending() == 0) { Thread.sleep(1000); } } private byte[] retrieveChallengeData(Sasl sasl) { byte[] saslChallengeBytes = new byte[sasl.pending()]; sasl.recv(saslChallengeBytes, 0, sasl.pending()); return saslChallengeBytes; } > (Proton-J) Custom Sasl > ---------------------- > > Key: PROTON-1718 > URL: https://issues.apache.org/jira/browse/PROTON-1718 > Project: Qpid Proton > Issue Type: Improvement > Components: proton-j > Affects Versions: proton-j-0.24.0 > Reporter: Tim Taylor > Labels: features > > I would like to be able to provide a custom SASL implementation for Proton-j > to use instead of being forced to use the default SaslImpl.java > implementation. > Ideally, code like below would be possible > private class CustomSasl implements org.apache.qpid.proton.engine.Sasl > { > ... > } > ... > ... > //transport.sasl(...) saves the provided sasl implementation and uses it > internally > Sasl sasl = transport.sasl(new CustomSasl()); > Do you currently have a workaround that would allow me to use Proton-J this > way? -- This message was sent by Atlassian JIRA (v6.4.14#64029) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org For additional commands, e-mail: dev-h...@qpid.apache.org