Author: rgodfrey
Date: Thu Oct 25 17:00:37 2012
New Revision: 1402217
URL: http://svn.apache.org/viewvc?rev=1402217&view=rev
Log:
PROTON-103 : Implement SASL in proton-j
Added:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportOutput.java
- copied, changed from r1402084,
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportInput.java
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportWrapper.java
Modified:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/Sasl.java
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslChallenge.java
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslInit.java
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslMechanisms.java
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslOutcome.java
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslResponse.java
qpid/proton/trunk/proton-j/src/main/scripts/proton.py
Modified:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/Sasl.java
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/Sasl.java?rev=1402217&r1=1402216&r2=1402217&view=diff
==============================================================================
---
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/Sasl.java
(original)
+++
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/Sasl.java
Thu Oct 25 17:00:37 2012
@@ -35,6 +35,13 @@ public interface Sasl
}
}
+ public static SaslOutcome PN_SASL_NONE = SaslOutcome.PN_SASL_NONE;
+ public static SaslOutcome PN_SASL_OK = SaslOutcome.PN_SASL_OK;
+ public static SaslOutcome PN_SASL_AUTH = SaslOutcome.PN_SASL_AUTH;
+ public static SaslOutcome PN_SASL_SYS = SaslOutcome.PN_SASL_SYS;
+ public static SaslOutcome PN_SASL_PERM = SaslOutcome.PN_SASL_PERM;
+ public static SaslOutcome PN_SASL_TEMP = SaslOutcome.PN_SASL_TEMP;
+
public int END_OF_STREAM = -1;
/**
* @param bytes input bytes for consumption
@@ -128,5 +135,7 @@ public interface Sasl
SaslOutcome getOutcome();
+ void client();
+ void server();
}
Copied:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportOutput.java
(from r1402084,
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportInput.java)
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportOutput.java?p2=qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportOutput.java&p1=qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportInput.java&r1=1402084&r2=1402217&rev=1402217&view=diff
==============================================================================
---
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportInput.java
(original)
+++
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportOutput.java
Thu Oct 25 17:00:37 2012
@@ -21,7 +21,7 @@
package org.apache.qpid.proton.engine;
-public interface TransportInput
+public interface TransportOutput
{
/**
@@ -31,7 +31,7 @@ public interface TransportInput
*
* @return the number of bytes consumed
*/
- public int input(byte[] bytes, int offset, int size);
+ public int output(byte[] bytes, int offset, int size);
}
Added:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportWrapper.java
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportWrapper.java?rev=1402217&view=auto
==============================================================================
---
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportWrapper.java
(added)
+++
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/TransportWrapper.java
Thu Oct 25 17:00:37 2012
@@ -0,0 +1,27 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.engine;
+
+
+public interface TransportWrapper extends TransportInput, TransportOutput
+{
+
+}
Modified:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java?rev=1402217&r1=1402216&r2=1402217&view=diff
==============================================================================
---
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
(original)
+++
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
Thu Oct 25 17:00:37 2012
@@ -6,6 +6,9 @@ import org.apache.qpid.proton.codec.Deco
import org.apache.qpid.proton.codec.EncoderImpl;
import org.apache.qpid.proton.codec.WritableBuffer;
import org.apache.qpid.proton.engine.Sasl;
+import org.apache.qpid.proton.engine.TransportInput;
+import org.apache.qpid.proton.engine.TransportOutput;
+import org.apache.qpid.proton.engine.TransportWrapper;
import org.apache.qpid.proton.type.AMQPDefinedTypes;
import org.apache.qpid.proton.type.Binary;
import org.apache.qpid.proton.type.Symbol;
@@ -35,6 +38,9 @@ public class SaslImpl implements Sasl, S
private boolean _headerWritten;
private Binary _challengeResponse;
private SaslFrameParser _frameParser;
+ private boolean _initReceived;
+ private boolean _mechanismsSent;
+
enum Role { CLIENT, SERVER };
@@ -57,9 +63,9 @@ public class SaslImpl implements Sasl, S
_overflowBuffer.flip();
}
- public boolean isDone()
+ boolean isDone()
{
- return _done;
+ return _done && (_role==Role.CLIENT || _initReceived);
}
public final int input(byte[] bytes, int offset, int size)
@@ -86,7 +92,7 @@ public class SaslImpl implements Sasl, S
}
if(!_overflowBuffer.hasRemaining())
{
- _overflowBuffer.clear();
+ _overflowBuffer.rewind();
CompositeWritableBuffer outputBuffer =
new CompositeWritableBuffer(
@@ -107,28 +113,31 @@ public class SaslImpl implements Sasl, S
if(_role == Role.SERVER)
{
- if(getState()== SaslState.PN_SASL_IDLE && _mechanisms != null)
+ if(!_mechanismsSent && _mechanisms != null)
{
SaslMechanisms mechanisms = new SaslMechanisms();
mechanisms.setSaslServerMechanisms(_mechanisms);
written += writeFrame(buffer, mechanisms);
+ _mechanismsSent = true;
+ _state = SaslState.PN_SASL_STEP;
}
- else if(getChallengeResponse() != null)
+
+ if(getState() == SaslState.PN_SASL_STEP && getChallengeResponse()
!= null)
{
SaslChallenge challenge = new SaslChallenge();
challenge.setChallenge(getChallengeResponse());
written+=writeFrame(buffer, challenge);
setChallengeResponse(null);
}
- else if(_done)
+
+ if(_done)
{
org.apache.qpid.proton.type.security.SaslOutcome outcome =
new org.apache.qpid.proton.type.security.SaslOutcome();
outcome.setCode(UnsignedByte.valueOf(_outcome.getCode()));
written+=writeFrame(buffer, outcome);
}
- return written;
}
else if(_role == Role.CLIENT)
{
@@ -141,12 +150,9 @@ public class SaslImpl implements Sasl, S
{
written += processResponse(buffer);
}
- return written;
- }
- else
- {
- throw new IllegalStateException("Client or server must be chosen");
}
+
+ return written;
}
int writeFrame(WritableBuffer buffer, SaslFrameBody frameBody)
@@ -170,6 +176,10 @@ public class SaslImpl implements Sasl, S
final public int recv(byte[] bytes, int offset, int size)
{
+ if(_pending == null)
+ {
+ return -1;
+ }
final int written = Math.min(size, _pending.remaining());
_pending.get(bytes, offset, written);
if(!_pending.hasRemaining())
@@ -243,18 +253,16 @@ public class SaslImpl implements Sasl, S
public void setMechanisms(String[] mechanisms)
{
- if(_role == Role.SERVER)
+ if(mechanisms != null)
{
- if(mechanisms != null)
+ _mechanisms = new Symbol[mechanisms.length];
+ for(int i = 0; i < mechanisms.length; i++)
{
- _mechanisms = new Symbol[mechanisms.length];
- for(int i = 0; i < mechanisms.length; i++)
- {
- _mechanisms[i] = Symbol.valueOf(mechanisms[i]);
- }
+ _mechanisms[i] = Symbol.valueOf(mechanisms[i]);
}
}
- else if(_role == Role.CLIENT)
+
+ if(_role == Role.CLIENT)
{
assert mechanisms != null;
assert mechanisms.length == 1;
@@ -297,16 +305,24 @@ public class SaslImpl implements Sasl, S
public void handleInit(SaslInit saslInit, Binary payload, Void context)
{
+ if(_role == null)
+ {
+ server();
+ }
+ checkRole(Role.SERVER);
_hostname = saslInit.getHostname();
+ _initReceived = true;
if(saslInit.getInitialResponse() != null)
{
setPending(saslInit.getInitialResponse().asByteBuffer());
+
}
}
public void handleResponse(SaslResponse saslResponse, Binary payload, Void
context)
{
+ checkRole(Role.SERVER);
setPending(saslResponse.getResponse() == null ? null :
saslResponse.getResponse().asByteBuffer());
}
@@ -323,19 +339,25 @@ public class SaslImpl implements Sasl, S
{
if(role != _role)
{
- throw new IllegalStateException();
+ throw new IllegalStateException("Role is " + _role + " but should
be " + role);
}
}
public void handleMechanisms(SaslMechanisms saslMechanisms, Binary
payload, Void context)
{
+ if(_role == null)
+ {
+ client();
+ }
+ checkRole(Role.CLIENT);
_mechanisms = saslMechanisms.getSaslServerMechanisms();
}
public void handleChallenge(SaslChallenge saslChallenge, Binary payload,
Void context)
{
+ checkRole(Role.CLIENT);
setPending(saslChallenge.getChallenge() == null ? null :
saslChallenge.getChallenge().asByteBuffer());
}
@@ -344,6 +366,7 @@ public class SaslImpl implements Sasl, S
Binary payload,
Void context)
{
+ checkRole(Role.CLIENT);
for(SaslOutcome outcome : SaslOutcome.values())
{
if(outcome.getCode() == saslOutcome.getCode().byteValue())
@@ -377,6 +400,7 @@ public class SaslImpl implements Sasl, S
public void plain(String username, String password)
{
+ client();
_chosenMechanism = Symbol.valueOf("PLAIN");
byte[] usernameBytes = username.getBytes();
byte[] passwordBytes = password.getBytes();
@@ -396,10 +420,57 @@ public class SaslImpl implements Sasl, S
public void client()
{
_role = Role.CLIENT;
+ if(_mechanisms != null)
+ {
+ assert _mechanisms.length == 1;
+
+ _chosenMechanism = _mechanisms[0];
+ }
}
public void server()
{
_role = Role.SERVER;
}
+
+
+ public TransportWrapper wrap(final TransportInput input, final
TransportOutput output)
+ {
+ return new TransportWrapper()
+ {
+ private boolean _outputComplete;
+
+ @Override
+ public int input(byte[] bytes, int offset, int size)
+ {
+ if(_role == null || (_role == Role.CLIENT && !_done) ||(_role
== Role.SERVER && (!_initReceived || !_done)))
+ {
+ return SaslImpl.this.input(bytes, offset, size);
+ }
+ else
+ {
+ return input.input(bytes, offset, size);
+ }
+ }
+
+
+ @Override
+ public int output(byte[] bytes, int offset, int size)
+ {
+ if(_role == null || (_role == Role.CLIENT && !_done) || (_role
== Role.SERVER && !_outputComplete))
+ {
+ int written = SaslImpl.this.output(bytes, offset, size);
+ if(_done && !_overflowBuffer.hasRemaining())
+ {
+ _outputComplete = true;
+ }
+ return written;
+ }
+ else
+ {
+ return output.output(bytes, offset, size);
+ }
+ }
+ };
+ }
}
Modified:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java?rev=1402217&r1=1402216&r2=1402217&view=diff
==============================================================================
---
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
(original)
+++
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
Thu Oct 25 17:00:37 2012
@@ -31,6 +31,8 @@ import org.apache.qpid.proton.engine.Sas
import org.apache.qpid.proton.engine.Transport;
import org.apache.qpid.proton.engine.TransportException;
import org.apache.qpid.proton.engine.TransportInput;
+import org.apache.qpid.proton.engine.TransportOutput;
+import org.apache.qpid.proton.engine.TransportWrapper;
import org.apache.qpid.proton.framing.TransportFrame;
import org.apache.qpid.proton.type.AMQPDefinedTypes;
import org.apache.qpid.proton.type.Binary;
@@ -78,7 +80,8 @@ public class TransportImpl extends Endpo
private TransportSession[] _remoteSessions;
private TransportSession[] _localSessions;
- private final TransportInput _inputProcessor;
+ private TransportInput _inputProcessor;
+ private TransportOutput _outputProcessor;
private Map<SessionImpl, TransportSession> _transportSessionState = new
HashMap<SessionImpl, TransportSession>();
private Map<LinkImpl, TransportLink> _transportLinkState = new
HashMap<LinkImpl, TransportLink>();
@@ -107,6 +110,14 @@ public class TransportImpl extends Endpo
FrameParser frameParser = new FrameParser(this);
_inputProcessor = frameParser;
+ _outputProcessor = new TransportOutput()
+ {
+ @Override
+ public int output(byte[] bytes, int offset, int size)
+ {
+ return transportOutput(bytes, offset, size);
+ }
+ };
}
public void bind(Connection conn)
@@ -163,6 +174,17 @@ public class TransportImpl extends Endpo
{
try
{
+ return _outputProcessor.output(bytes, offset, size);
+ }
+ catch (RuntimeException e)
+ {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ private int transportOutput(byte[] bytes, int offset, int size)
+ {
int written = 0;
if(_overflowBuffer.hasRemaining())
@@ -186,7 +208,7 @@ public class TransportImpl extends Endpo
written += processAttach(outputBuffer);
written += processReceiverFlow(outputBuffer);
written += processReceiverDisposition(outputBuffer);
- written += processReceiverFlow(outputBuffer); // TODO
+ written += processReceiverFlow(outputBuffer);
written += processMessageData(outputBuffer);
written += processSenderDisposition(outputBuffer);
written += processSenderFlow(outputBuffer);
@@ -198,12 +220,6 @@ public class TransportImpl extends Endpo
return written - _overflowBuffer.remaining();
- }
- catch (RuntimeException e)
- {
- e.printStackTrace();
- throw e;
- }
}
public Sasl sasl()
@@ -211,6 +227,9 @@ public class TransportImpl extends Endpo
if(_sasl == null)
{
_sasl = new SaslImpl();
+ TransportWrapper transportWrapper = _sasl.wrap(_inputProcessor,
_outputProcessor);
+ _inputProcessor = transportWrapper;
+ _outputProcessor = transportWrapper;
}
return _sasl;
Modified:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslChallenge.java
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslChallenge.java?rev=1402217&r1=1402216&r2=1402217&view=diff
==============================================================================
---
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslChallenge.java
(original)
+++
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslChallenge.java
Thu Oct 25 17:00:37 2012
@@ -150,4 +150,12 @@ public class SaslChallenge
decoder.register(descriptor, constructor);
}
}
+
+ @Override
+ public String toString()
+ {
+ return "SaslChallenge{" +
+ "challenge=" + _challenge +
+ '}';
+ }
}
Modified:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslInit.java
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslInit.java?rev=1402217&r1=1402216&r2=1402217&view=diff
==============================================================================
---
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslInit.java
(original)
+++
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslInit.java
Thu Oct 25 17:00:37 2012
@@ -119,6 +119,16 @@ public class SaslInit
}
+ @Override
+ public String toString()
+ {
+ return "SaslInit{" +
+ "mechanism=" + _mechanism +
+ ", initialResponse=" + _initialResponse +
+ ", hostname=" + (_hostname == null ? "null":'\''+ _hostname +
'\'') +
+ '}';
+ }
+
public <E> void invoke(SaslFrameBodyHandler<E> handler, Binary payload, E
context)
{
handler.handleInit(this, payload, context);
Modified:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslMechanisms.java
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslMechanisms.java?rev=1402217&r1=1402216&r2=1402217&view=diff
==============================================================================
---
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslMechanisms.java
(original)
+++
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslMechanisms.java
Thu Oct 25 17:00:37 2012
@@ -22,14 +22,17 @@
package org.apache.qpid.proton.type.security;
-import java.util.List;
-import java.util.AbstractList;
-
+import java.util.AbstractList;
+import java.util.Arrays;
+import java.util.List;
import org.apache.qpid.proton.codec.DecodeException;
import org.apache.qpid.proton.codec.Decoder;
import org.apache.qpid.proton.codec.DescribedTypeConstructor;
-import org.apache.qpid.proton.type.*;
+import org.apache.qpid.proton.type.Binary;
+import org.apache.qpid.proton.type.DescribedType;
+import org.apache.qpid.proton.type.Symbol;
+import org.apache.qpid.proton.type.UnsignedLong;
public class SaslMechanisms
@@ -158,4 +161,13 @@ public class SaslMechanisms
decoder.register(descriptor, constructor);
}
}
+
+ @Override
+ public String toString()
+ {
+ return "SaslMechanisms{" +
+ "saslServerMechanisms=" + (_saslServerMechanisms == null ? null
: Arrays.asList(_saslServerMechanisms))
+ +
+ '}';
+ }
}
Modified:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslOutcome.java
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslOutcome.java?rev=1402217&r1=1402216&r2=1402217&view=diff
==============================================================================
---
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslOutcome.java
(original)
+++
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslOutcome.java
Thu Oct 25 17:00:37 2012
@@ -104,6 +104,15 @@ public class SaslOutcome
}
+ @Override
+ public String toString()
+ {
+ return "SaslOutcome{" +
+ "_code=" + _code +
+ ", _additionalData=" + _additionalData +
+ '}';
+ }
+
public <E> void invoke(SaslFrameBodyHandler<E> handler, Binary payload, E
context)
{
handler.handleOutcome(this, payload, context);
Modified:
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslResponse.java
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslResponse.java?rev=1402217&r1=1402216&r2=1402217&view=diff
==============================================================================
---
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslResponse.java
(original)
+++
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/type/security/SaslResponse.java
Thu Oct 25 17:00:37 2012
@@ -89,6 +89,13 @@ public class SaslResponse
}
+ @Override
+ public String toString()
+ {
+ return "SaslResponse{response=" + _response +
+ '}';
+ }
+
public <E> void invoke(SaslFrameBodyHandler<E> handler, Binary payload, E
context)
{
handler.handleResponse(this, payload, context);
Modified: qpid/proton/trunk/proton-j/src/main/scripts/proton.py
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/scripts/proton.py?rev=1402217&r1=1402216&r2=1402217&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/src/main/scripts/proton.py (original)
+++ qpid/proton/trunk/proton-j/src/main/scripts/proton.py Thu Oct 25 17:00:37
2012
@@ -18,7 +18,7 @@
#
from uuid import UUID
-from org.apache.qpid.proton.engine import EndpointState, TransportException
+from org.apache.qpid.proton.engine import EndpointState, TransportException,
Sasl
from org.apache.qpid.proton.engine.impl import ConnectionImpl, SessionImpl, \
SenderImpl, ReceiverImpl, TransportImpl
from org.apache.qpid.proton.message import Message as MessageImpl, \
@@ -592,8 +592,51 @@ class Message(object):
class SASL(object):
- def __init__(self, *args, **kwargs):
- raise Skipped()
+ OK = Sasl.PN_SASL_OK
+ AUTH = Sasl.PN_SASL_AUTH
+
+ def __init__(self,transport):
+ self._sasl = transport.impl.sasl()
+
+ def mechanisms(self, mechanisms):
+ self._sasl.setMechanisms(mechanisms.split())
+
+ def client(self):
+ self._sasl.client()
+
+ def server(self):
+ self._sasl.server()
+
+ def send(self, data):
+ self._sasl.send(data, 0, len(data))
+
+ def recv(self):
+ size = 4096
+ output = zeros(size, "b")
+ n = self._sasl.recv(output, 0, size)
+ if n >= 0:
+ return output.tostring()[:n]
+ elif n == TransportImpl.END_OF_STREAM:
+ return None
+ else:
+ raise Exception(n)
+
+ def _get_outcome(self):
+ value = self._sasl.getOutcome()
+ if value == Sasl.PN_SASL_NONE:
+ return None
+ else:
+ return value
+ def _set_outcome(self, outcome):
+ self.impl.setOutcome(outcome)
+
+ outcome = property(_get_outcome, _set_outcome)
+
+ def done(self, outcome):
+ self._sasl.done(outcome)
+
+ def plain(self, user, password):
+ self._sasl.plain(user,password)
class SSL(object):
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]