qpid-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tim Taylor (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (PROTON-1718) (Proton-J) Custom Sasl
Date Fri, 22 Dec 2017 19:31:00 GMT

    [ https://issues.apache.org/jira/browse/PROTON-1718?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16301860#comment-16301860
] 

Tim Taylor commented on PROTON-1718:
------------------------------------

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;
}

> (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-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org


Mime
View raw message