Changeset 6b825fb


Ignore:
Timestamp:
Apr 5, 2009 9:32:43 PM (11 years ago)
Author:
mkvore-commit <mkvore-commit@…>
Branches:
master
Children:
1bc4cb3
Parents:
2cf5221
Message:

SAMv3 : protocol better specified, and small changes in the code reflecting the new protocol

Location:
apps/sam
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • apps/sam/Demos/datagramTests/samForward.py

    r2cf5221 r6b825fb  
    2424sess.send("HELLO VERSION MIN=3.0 MAX=3.0\n")
    2525sys.stdout.write(sess.recv(1000))
    26 sess.send("SESSION CREATE STYLE=DATAGRAM PORT="+str(port)+" ID="+name+" DESTINATION=EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHNqwgkhJnBW4ymaRsdVmITAha-ff0UiALfKSlznqp5HcSewgMHbzQ0I01TQytFnW\n")
     26sess.send("SESSION CREATE STYLE=DATAGRAM PORT="+str(port)+" ID="+name+" DESTINATION=EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHNqwgkhJnBW4ymaRsdVmITAha-ff0UiALfKSlznqp5HcSewgMHbzQ0I01TQytFnW outbound.nickname="+name+" inbound.nickname="+name+" outbound.length=0\n")
    2727sys.stdout.write(sess.recv(10000))
    2828
  • apps/sam/Demos/datagramTests/samOut.py

    r2cf5221 r6b825fb  
    2727s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    2828s.bind(("", 0))
    29 s.sendto(name+" tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAA\n"+message, (host, port))
    30 s.sendto(name+" EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAA\n"+message, (host, port))
     29s.sendto("3.0 "+name+" tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAA\n"+message, (host, port))
     30s.sendto("3.0 "+name+" EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAA\n"+message, (host, port))
    3131
  • apps/sam/Demos/rawTests/samOut.py

    r2cf5221 r6b825fb  
    2727s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    2828s.bind(("", 0))
    29 s.sendto(name+" tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAA\n"+message, (host, port))
    30 s.sendto(name+" EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAA\n"+message, (host, port))
     29s.sendto("3.0 "+name+" tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAA\n"+message, (host, port))
     30s.sendto("3.0 "+name+" EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAA\n"+message, (host, port))
    3131
  • apps/sam/Demos/streamTests/samForward.py

    r2cf5221 r6b825fb  
    5656    sys.stdout.write(chunk)
    5757    if not chunk : break
     58print "Forward socket closed"
     59l=0
     60while 1 :
     61    chunk = sess.recv(100)
     62    sys.stdout.write(chunk)
     63    if not chunk : break
    5864
  • apps/sam/Demos/streamTests/samIn.py

    r2cf5221 r6b825fb  
    4545        sys.stdout.write(sock.recv(1000))
    4646        sock.send("STREAM ACCEPT ID=" + name + silent+"\n")
    47         print "STREAM ACCEPT ID="+name+silent+"\n"
     47        print "STREAM ACCEPT ID="+name+silent
     48        if (silent==" SILENT=false") :
     49                sys.stdout.write( sock.recv(100) )
    4850        return sock
    4951
     
    5254        while lines==-1 or l<lines :
    5355            chunk = sock.recv(1000)
    54             sys.stdout.write(chunk)
    5556            if lines!=-1 : l = l + 1
    5657            if not chunk : break
     58            print chunk
    5759            sock.send(chunk)
    5860        print
  • apps/sam/java/src/net/i2p/sam/SAMBridge.java

    r2cf5221 r6b825fb  
    281281                               + s.socket().getPort());
    282282
    283                 try {
    284                     SAMHandler handler = SAMHandlerFactory.createSAMHandler(s, i2cpProps);
    285                     if (handler == null) {
    286                         if (_log.shouldLog(Log.DEBUG))
    287                             _log.debug("SAM handler has not been instantiated");
     283                class HelloHandler implements Runnable {
     284                        SocketChannel s ;
     285                        SAMBridge parent ;
     286                        HelloHandler(SocketChannel s, SAMBridge parent) {
     287                                this.s = s ;
     288                        }
     289                        public void run() {
    288290                        try {
    289                             s.close();
    290                         } catch (IOException e) {}
    291                         continue;
    292                     }
    293                     handler.setBridge(this);
    294                     handler.startHandling();
    295                 } catch (SAMException e) {
    296                     if (_log.shouldLog(Log.ERROR))
    297                         _log.error("SAM error: " + e.getMessage(), e);
    298                     try {
    299                         String reply = "HELLO REPLY RESULT=I2P_ERROR MESSAGE=\"" + e.getMessage() + "\"\n";
    300                         s.write(ByteBuffer.wrap(reply.getBytes("ISO-8859-1")));
    301                     } catch (IOException ioe) {
    302                         if (_log.shouldLog(Log.ERROR))
    303                             _log.error("SAM Error sending error reply", ioe);
    304                     }
    305                     try { s.close(); } catch (IOException ioe) {}
    306                 } catch (Exception ee) {
    307                     try { s.close(); } catch (IOException ioe) {}
    308                     _log.log(Log.CRIT, "Unexpected error handling SAM connection", ee);
    309                 }
     291                            SAMHandler handler = SAMHandlerFactory.createSAMHandler(s, i2cpProps);
     292                            if (handler == null) {
     293                                if (_log.shouldLog(Log.DEBUG))
     294                                    _log.debug("SAM handler has not been instantiated");
     295                                try {
     296                                    s.close();
     297                                } catch (IOException e) {}
     298                                return;
     299                            }
     300                            handler.setBridge(parent);
     301                            handler.startHandling();
     302                        } catch (SAMException e) {
     303                            if (_log.shouldLog(Log.ERROR))
     304                                _log.error("SAM error: " + e.getMessage(), e);
     305                            try {
     306                                String reply = "HELLO REPLY RESULT=I2P_ERROR MESSAGE=\"" + e.getMessage() + "\"\n";
     307                                s.write(ByteBuffer.wrap(reply.getBytes("ISO-8859-1")));
     308                            } catch (IOException ioe) {
     309                                if (_log.shouldLog(Log.ERROR))
     310                                    _log.error("SAM Error sending error reply", ioe);
     311                            }
     312                            try { s.close(); } catch (IOException ioe) {}
     313                        } catch (Exception ee) {
     314                            try { s.close(); } catch (IOException ioe) {}
     315                            _log.log(Log.CRIT, "Unexpected error handling SAM connection", ee);
     316                        }                               
     317                        }
     318                }
     319                new I2PAppThread(new HelloHandler(s,this), "HelloHandler").start();
    310320            }
    311321        } catch (Exception e) {
  • apps/sam/java/src/net/i2p/sam/SAMHandlerFactory.java

    r2cf5221 r6b825fb  
    8585
    8686        String ver = chooseBestVersion(minVer, maxVer);
    87         if (ver == null)
    88             throw new SAMException("No version specified");
    8987
    90         // Let's answer positively
    9188        try {
     89            if (ver == null) {
     90                s.write(ByteBuffer.wrap(("HELLO REPLY RESULT=NOVERSION\n").getBytes("ISO-8859-1")));
     91                return null ;
     92            }
     93            // Let's answer positively
    9294            s.write(ByteBuffer.wrap(("HELLO REPLY RESULT=OK VERSION="
    9395                       + ver + "\n").getBytes("ISO-8859-1")));
  • apps/sam/java/src/net/i2p/sam/SAMUtils.java

    r2cf5221 r6b825fb  
    99 */
    1010
     11import java.io.ByteArrayInputStream;
    1112import java.io.IOException;
    1213import java.io.OutputStream;
     
    2021import net.i2p.client.I2PClientFactory;
    2122import net.i2p.client.naming.NamingService;
     23import net.i2p.data.Base64;
    2224import net.i2p.data.DataFormatException;
    2325import net.i2p.data.Destination;
     26import net.i2p.data.PrivateKey;
     27import net.i2p.data.SigningPrivateKey;
    2428import net.i2p.util.Log;
    2529
     
    7478        }
    7579    }
     80   
     81    public static class InvalidDestination extends Exception {
     82        static final long serialVersionUID = 0x1 ;
     83    }
     84    public static void checkPrivateDestination(String dest) throws InvalidDestination {
     85        ByteArrayInputStream destKeyStream = new ByteArrayInputStream(Base64.decode(dest));
     86
     87        try {
     88                new Destination().readBytes(destKeyStream);
     89                new PrivateKey().readBytes(destKeyStream);
     90                new SigningPrivateKey().readBytes(destKeyStream);
     91        } catch (Exception e) {
     92                throw new InvalidDestination();
     93        }
     94    }
     95
    7696
    7797    /**
     
    109129     * @return the Destination for the specified hostname, or null if not found
    110130     */
    111     public static Destination getDest(String s)
     131    public static Destination getDest(String s) throws DataFormatException
    112132    {
    113           Destination d = new Destination() ;
    114           try {
    115                   d.fromBase64(s);
    116                   return d ;
    117           } catch (DataFormatException e) {
    118                   return  lookupHost(s, null);
    119           }
     133        Destination d = new Destination() ;
     134        try {
     135                d.fromBase64(s);
     136        } catch (DataFormatException e) {
     137                d = lookupHost(s, null);
     138                if ( d==null ) {
     139                        throw e ;
     140                }
     141        }
     142        return d ;
    120143    }
    121144
  • apps/sam/java/src/net/i2p/sam/SAMv1Handler.java

    r2cf5221 r6b825fb  
    328328            }
    329329
    330             Destination dest;
     330            Destination dest = null ;
    331331            if (name.equals("ME")) {
    332332                if (getRawSession() != null) {
     
    341341                }
    342342            } else {
    343                 dest = SAMUtils.getDest(name);
     343                try {
     344                        dest = SAMUtils.getDest(name);
     345                } catch (DataFormatException e) {
     346                }
    344347            }
    345348           
  • apps/sam/java/src/net/i2p/sam/SAMv3Handler.java

    r2cf5221 r6b825fb  
    3333import net.i2p.data.Destination;
    3434import net.i2p.util.Log;
    35 import net.i2p.data.VerifiedDestination;
    3635import net.i2p.util.I2PAppThread;
    3736
     
    183182                        String nick ;
    184183                        String dest ;
     184                        String version ;
    185185
    186186                        try {
    187187                                header = DataHelper.readLine(is).trim();
    188188                                StringTokenizer tok = new StringTokenizer(header, " ");
    189                                 if (tok.countTokens() != 2) {
     189                                if (tok.countTokens() != 3) {
    190190                                        // This is not a correct message, for sure
    191191                                        _log.debug("Error in message format");
    192192                                        return;
    193193                                }
     194                                version = tok.nextToken();
     195                                if (!"3.0".equals(version)) return ;
    194196                                nick = tok.nextToken();
    195197                                dest = tok.nextToken();
     
    258260                static final long serialVersionUID = 0x1 ;
    259261
     262                class ExistingId   extends Exception {
     263                        static final long serialVersionUID = 0x1 ;
     264                }
     265                class ExistingDest extends Exception {
     266                        static final long serialVersionUID = 0x1 ;
     267                }
     268               
    260269                HashMap<String, SessionRecord> map ;
    261270
     
    264273                }
    265274
    266                 synchronized public boolean put( String nick, SessionRecord session )
    267                 {
     275                synchronized public boolean put( String nick, SessionRecord session ) throws ExistingId, ExistingDest
     276                {
     277                        if ( map.containsKey(nick) ) {
     278                                throw new ExistingId();
     279                        }
     280                        for ( SessionRecord r : map.values() ) {
     281                                if (r.getDest().equals(session.getDest())) {
     282                                        throw new ExistingDest();
     283                                }
     284                        }
     285
    268286                        if ( !map.containsKey(nick) ) {
    269287                                session.createThreadGroup("SAM session "+nick);
     
    456474                                }
    457475
    458                                 boolean good_key = false ;
    459476                                try {
    460                                         good_key = (new VerifiedDestination(dest)).verifyCert(true);
    461                                 } catch (DataFormatException e) {
    462                                         good_key = false ;
    463                                 }
    464                                 if (!good_key)
    465                                 {
    466                                         _log.debug("Bad destination key");
    467                                         return writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"bad destination key\"\n");
     477                                        SAMUtils.checkPrivateDestination(dest);
     478                                } catch ( SAMUtils.InvalidDestination e ) {
     479                    return writeString("SESSION STATUS RESULT=INVALID_KEY\n");
    468480                                }
    469481
     
    490502                                allProps.putAll(props);
    491503                               
    492                                 if (! sSessionsHash.put( nick, new SessionRecord(dest, allProps, this) ) ) {
     504
     505                                try {
     506                                        sSessionsHash.put( nick, new SessionRecord(dest, allProps, this) ) ;
     507                                } catch (SessionsDB.ExistingId e) {
    493508                                        _log.debug("SESSION ID parameter already in use");
    494                                         String n = nick ;
    495                                         return writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"ID "+n+" already in use\"\n");
    496                                 }
    497 
     509                                        return writeString("SESSION STATUS RESULT=DUPLICATED_ID\n");
     510                                } catch (SessionsDB.ExistingDest e) {
     511                                        return writeString("SESSION STATUS RESULT=DUPLICATED_DEST\n");
     512                                }
     513
     514                               
    498515                                // Create the session
    499516
     
    569586                {
    570587                        _log.error ( "STREAM message received, but this session is a master session" );
    571                         writeString("STREAM STATUS RESULT=I2P_ERROR MESSAGE=\"master session cannot be used for streams");
     588                       
     589                        try {
     590                                notifyStreamResult(true, "I2P_ERROR", "master session cannot be used for streams");
     591                        } catch (IOException e) {}
    572592                        return false;
    573593                }
     
    576596                if (nick == null) {
    577597                        _log.debug("SESSION ID parameter not specified");
    578                         writeString("STREAM STATUS RESULT=I2P_ERROR MESSAGE=\"ID not specified\"\n");
     598                        try {
     599                                notifyStreamResult(true, "I2P_ERROR", "ID not specified");
     600                        } catch (IOException e) {}
    579601                        return false ;
    580602                }
     
    585607                if ( rec==null ) {
    586608                        _log.debug("STREAM SESSION ID does not exist");
    587                         writeString("STREAM STATUS RESULT=I2P_ERROR MESSAGE=\"STREAM SESSION ID does not exist\"\n");
     609                        try {
     610                                notifyStreamResult(true, "INVALID_ID", "STREAM SESSION ID does not exist");
     611                        } catch (IOException e) {}
    588612                        return false ;
    589613                }
     
    593617                if (streamSession==null) {
    594618                        _log.debug("specified ID is not a stream session");
    595                         writeString("STREAM STATUS RESULT=I2P_ERROR MESSAGE=\"specified ID is not a STREAM session\"\n");
     619                        try {
     620                                notifyStreamResult(true, "I2P_ERROR",  "specified ID is not a STREAM session");
     621                        } catch (IOException e) {}
    596622                        return false ;
    597623                }
     
    613639                        _log.debug ( "Unrecognized RAW message opcode: \""
    614640                                        + opcode + "\"" );
    615                         writeString("STREAM STATUS RESULT=I2P_ERROR MESSAGE=\"Unrecognized RAW message opcode: \""
    616                                         + opcode + "\"" );
     641                        try {
     642                                notifyStreamResult(true, "I2P_ERROR",  "Unrecognized RAW message opcode: "+opcode );
     643                        } catch (IOException e) {}
    617644                        return false;
    618645                }
    619646        }
    620647
     648       
    621649        protected boolean execStreamConnect( Properties props) {
    622                 if (props == null) {
    623                         _log.debug("No parameters specified in STREAM CONNECT message");
    624                         return false;
    625                 }
    626                 boolean verbose = props.getProperty("SILENT","false").equals("false");
    627                
    628                 String dest = props.getProperty("DESTINATION");
    629                 if (dest == null) {
    630                         _log.debug("Destination not specified in RAW SEND message");
    631                         return false;
    632                 }
    633                 props.remove("DESTINATION");
    634 
    635650                try {
     651                        if (props == null) {
     652                                notifyStreamResult(true,"I2P_ERROR","No parameters specified in STREAM CONNECT message");
     653                                _log.debug("No parameters specified in STREAM CONNECT message");
     654                                return false;
     655                        }
     656                        boolean verbose = props.getProperty("SILENT","false").equals("false");
     657               
     658                        String dest = props.getProperty("DESTINATION");
     659                        if (dest == null) {
     660                                notifyStreamResult(verbose, "I2P_ERROR", "Destination not specified in RAW SEND message");
     661                                _log.debug("Destination not specified in RAW SEND message");
     662                                return false;
     663                        }
     664                        props.remove("DESTINATION");
     665
    636666                        try {
    637667                                streamSession.connect( this, dest, props );
     
    639669                        } catch (DataFormatException e) {
    640670                                _log.debug("Invalid destination in STREAM CONNECT message");
    641                                 if (verbose) notifyStreamAccept ( "INVALID_KEY" );
     671                                notifyStreamResult ( verbose, "INVALID_KEY", null );
    642672                        } catch (ConnectException e) {
    643673                                _log.debug("STREAM CONNECT failed: " + e.getMessage());
    644                                 if (verbose) notifyStreamAccept ( "CONNECTION_REFUSED" );
     674                                notifyStreamResult ( verbose, "CONNECTION_REFUSED", null );
    645675                        } catch (NoRouteToHostException e) {
    646676                                _log.debug("STREAM CONNECT failed: " + e.getMessage());
    647                                 if (verbose) notifyStreamAccept ( "CANT_REACH_PEER" );
     677                                notifyStreamResult ( verbose, "CANT_REACH_PEER", null );
    648678                        } catch (InterruptedIOException e) {
    649679                                _log.debug("STREAM CONNECT failed: " + e.getMessage());
    650                                 if (verbose) notifyStreamAccept ( "TIMEOUT" );
     680                                notifyStreamResult ( verbose, "TIMEOUT", null );
    651681                        } catch (I2PException e) {
    652682                                _log.debug("STREAM CONNECT failed: " + e.getMessage());
    653                                 if (verbose) notifyStreamAccept ( "I2P_ERROR" );
     683                                notifyStreamResult ( verbose, "I2P_ERROR", e.getMessage() );
    654684                        }
    655685                } catch (IOException e) {
     
    662692                        try {
    663693                                streamSession.startForwardingIncoming(props);
    664                                 notifyStreamAccept("OK");
    665                                 return true ;
     694                                notifyStreamResult( true, "OK", null );
     695                                return false ;
    666696                        } catch (SAMException e) {
    667697                                _log.debug("Forwarding STREAM connections failed: " + e.getMessage());
    668                                 notifyStreamAccept ( "FORWARDER_FAILED" );
     698                                notifyStreamResult ( true, "I2P_ERROR", "Forwarding failed : " + e.getMessage() );
    669699                        }
    670700                } catch (IOException e) {
     
    678708                try {
    679709                        try {
     710                                notifyStreamResult(verbose, "OK", null);
    680711                                streamSession.accept(this, verbose);
    681712                                return true ;
    682713                        } catch (InterruptedIOException e) {
    683714                                _log.debug("STREAM ACCEPT failed: " + e.getMessage());
    684                                 if (verbose) notifyStreamAccept( "TIMEOUT" );
     715                                notifyStreamResult( verbose, "TIMEOUT", e.getMessage() );
    685716                        } catch (I2PException e) {
    686717                                _log.debug("STREAM ACCEPT failed: " + e.getMessage());
    687                                 if (verbose) notifyStreamAccept ( "I2P_ERROR" );
     718                                notifyStreamResult ( verbose, "I2P_ERROR", e.getMessage() );
    688719                        } catch (SAMException e) {
    689720                                _log.debug("STREAM ACCEPT failed: " + e.getMessage());
    690                                 if (verbose) notifyStreamAccept ( "ALREADY_ACCEPTING" );
     721                                notifyStreamResult ( verbose, "ALREADY_ACCEPTING", null );
    691722                        }
    692723                } catch (IOException e) {
     
    696727       
    697728
    698         public void notifyStreamAccept(String status) throws IOException
     729        public void notifyStreamResult(boolean verbose, String result, String message) throws IOException
    699730    {
    700         if ( streamSession == null )
    701         {
    702             _log.error ( "BUG! Received stream connection, but session is null!" );
    703             throw new NullPointerException ( "BUG! STREAM session is null!" );
    704         }
    705 
    706         if ( !writeString ( "STREAM STATUS RESULT="
    707                         + status
    708                         + "\n" ) )
    709         {
    710             throw new IOException ( "Error notifying connection to SAM client" );
    711         }
    712     }
    713 
    714         public void notifyStreamOutgoingConnection(String result) throws IOException
    715     {
    716         if ( streamSession == null )
    717         {
    718             _log.error ( "BUG! Received stream connection, but session is null!" );
    719             throw new NullPointerException ( "BUG! STREAM session is null!" );
    720         }
    721 
    722         if ( !writeString ( "STREAM STATUS RESULT="
    723                         + result
    724                         + "\n" ) )
     731                if (!verbose) return ;
     732               
     733                String out = "STREAM STATUS RESULT="+result;
     734                if (message!=null)
     735                        out = out + " MESSAGE=\"" + message + "\"";
     736                out = out + '\n';
     737       
     738        if ( !writeString ( out ) )
    725739        {
    726740            throw new IOException ( "Error notifying connection to SAM client" );
  • apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java

    r2cf5221 r6b825fb  
    7878
    7979            private void initSAMStreamSession(String login)
    80                 throws IOException, DataFormatException, SAMException{
     80                throws IOException, DataFormatException, SAMException {
    8181
    8282                SAMv3Handler.SessionRecord rec = getDB().get(login);
     
    132132
    133133                boolean verbose = (props.getProperty("SILENT", "false").equals("false"));
    134                 Destination d = new Destination();
    135                 d = SAMUtils.getDest(dest);
     134                Destination d = SAMUtils.getDest(dest);
    136135
    137136                I2PSocketOptions opts = socketMgr.buildOptions(props);
     
    149148                if ( rec==null ) throw new InterruptedIOException() ;
    150149               
    151                 if (verbose) handler.notifyStreamOutgoingConnection("OK") ;
     150                handler.notifyStreamResult(verbose, "OK", null) ;
    152151
    153152                handler.stealSocket() ;
Note: See TracChangeset for help on using the changeset viewer.