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]

Reply via email to