Changeset edde533


Ignore:
Timestamp:
Feb 6, 2016 4:56:37 PM (5 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
b6deae9
Parents:
ceb7791
Message:

SAM v3.3: Fixes after testing

  • More error checking
  • Better error responses
  • Fix listen port and protocol for DATAGRAM and RAW
  • Fix adding sessions with duplicate dests to DB
  • Add more sessions in SAMStreamSink
Location:
apps/sam/java/src/net/i2p/sam
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • apps/sam/java/src/net/i2p/sam/MasterSession.java

    rceb7791 redde533  
    4343        private final Map<String, SAMMessageSess> sessions;
    4444        private final StreamAcceptor streamAcceptor;
     45        private static final String[] INVALID_OPTS = { "PORT", "HOST", "FROM_PORT", "TO_PORT", "PROTOCOL" };
    4546
    4647        /**
     
    5859                        throws IOException, DataFormatException, SAMException {
    5960                super(nick);
     61                for (int i = 0; i < INVALID_OPTS.length; i++) {
     62                        String p = INVALID_OPTS[i];
     63                        if (props.containsKey(p))
     64                                throw new SAMException("MASTER session options may not contain " + p);
     65                }
    6066                dgs = dgServer;
    6167                sessions = new ConcurrentHashMap<String, SAMMessageSess>(4);
     
    163169                rec = new SessionRecord(getDestination().toBase64(), props, subhandler);
    164170                try {
    165                         if (!SAMv3Handler.sSessionsHash.put(nick, rec))
    166                                 return "Duplicate ID " + nick;
     171                        SAMv3Handler.sSessionsHash.putDupDestOK(nick, rec);
    167172                        sessions.put(nick, sess);
    168173                } catch (SessionsDB.ExistingIdException e) {
    169                         return e.toString();
    170                 } catch (SessionsDB.ExistingDestException e) {
    171                         // fixme need new db method for dup dests
    172                 }
    173                 // listeners etc
     174                        return "Duplicate ID " + nick;
     175                }
     176                if (_log.shouldWarn())
     177                        _log.warn("added " + style + " proto " + listenProtocol + " port " + listenPort);
    174178
    175179                sess.start();
  • apps/sam/java/src/net/i2p/sam/SAMMessageSession.java

    rceb7791 redde533  
    6868        if (_log.shouldLog(Log.DEBUG))
    6969            _log.debug("Initializing SAM message-based session");
    70 
     70        listenProtocol = I2PSession.PROTO_ANY;
     71        listenPort = I2PSession.PORT_ANY;
    7172        handler = new SAMMessageSessionHandler(destStream, props);
    7273        session = handler.getSession();
    73         listenProtocol = I2PSession.PROTO_ANY;
    74         listenPort = I2PSession.PORT_ANY;
    7574    }
    7675
     
    9089        if (_log.shouldLog(Log.DEBUG))
    9190            _log.debug("Initializing SAM message-based session");
    92 
     91        this.listenProtocol = listenProtocol;
     92        this.listenPort = listenPort;
    9393        session = sess;
    9494        handler = new SAMMessageSessionHandler(session);
    95         this.listenProtocol = listenProtocol;
    96         this.listenPort = listenPort;
    9795    }
    9896
  • apps/sam/java/src/net/i2p/sam/SAMStreamSession.java

    rceb7791 redde533  
    369369     */
    370370    public boolean sendBytes(String s, byte[] b, int pr, int fp, int tp) throws I2PSessionException {
    371         throw new I2PSessionException("Unsupported in stream or master session");
     371        throw new I2PSessionException("Unsupported in STREAM or MASTER session");
    372372    }
    373373
  • apps/sam/java/src/net/i2p/sam/SAMv3Handler.java

    rceb7791 redde533  
    315315                        if (_log.shouldLog(Log.DEBUG))
    316316                                _log.debug("Caught IOException in handler", e);
     317                        writeString(SESSION_ERROR, e.getMessage());
    317318                } catch (SAMException e) {
    318319                        _log.error("Unexpected exception for message [" + msg + ']', e);
     320                        writeString(SESSION_ERROR, e.getMessage());
    319321                } catch (RuntimeException e) {
    320322                        _log.error("Unexpected exception for message [" + msg + ']', e);
     323                        writeString(SESSION_ERROR, e.getMessage());
    321324                } finally {
    322325                        if (_log.shouldLog(Log.DEBUG))
     
    468471                                        allProps.setProperty("i2p.streaming.enforceProtocol", "true");
    469472                                        allProps.setProperty("i2cp.dontPublishLeaseSet", "false");
    470                                         allProps.setProperty("FROM_PORT", Integer.toString(I2PSession.PORT_UNSPECIFIED));
    471                                         allProps.setProperty("TO_PORT", Integer.toString(I2PSession.PORT_UNSPECIFIED));
    472473                                }
    473474
     
    531532                                }
    532533                                if (msg == null)
    533                                         return writeString("SESSION STATUS RESULT=OK", opcode + ' ' + nick);
     534                                        return writeString("SESSION STATUS RESULT=OK ID=\"" + nick + '"', opcode + ' ' + nick);
    534535                                else
    535                                         return writeString(SESSION_ERROR, msg);
     536                                        return writeString(SESSION_ERROR + " ID=\"" + nick + '"', msg);
    536537                        } else {
    537538                                if (_log.shouldLog(Log.DEBUG))
     
    582583                if ( session != null )
    583584                {
    584                         _log.error ( "STREAM message received, but this session is a master session" );
    585                        
     585                        _log.error("v3 control socket cannot be used for STREAM");
    586586                        try {
    587                                 notifyStreamResult(true, "I2P_ERROR", "master session cannot be used for streams");
     587                                notifyStreamResult(true, "I2P_ERROR", "v3 control socket cannot be used for STREAM");
    588588                        } catch (IOException e) {}
    589589                        return false;
  • apps/sam/java/src/net/i2p/sam/SessionsDB.java

    rceb7791 redde533  
    3333        }
    3434
    35         /** @return success */
    36         synchronized public boolean put( String nick, SessionRecord session )
     35        public synchronized void put(String nick, SessionRecord session)
    3736                throws ExistingIdException, ExistingDestException
    3837        {
     
    4544                        }
    4645                }
     46                session.createThreadGroup("SAM session "+nick);
     47                map.put(nick, session) ;
     48        }
    4749
    48                 if ( !map.containsKey(nick) ) {
    49                         session.createThreadGroup("SAM session "+nick);
    50                         map.put(nick, session) ;
    51                         return true ;
     50        /** @since 0.9.25 */
     51        public synchronized void putDupDestOK(String nick, SessionRecord session)
     52                throws ExistingIdException
     53        {
     54                if (map.containsKey(nick)) {
     55                        throw new ExistingIdException();
    5256                }
    53                 else
    54                         return false ;
     57                session.createThreadGroup("SAM session "+nick);
     58                map.put(nick, session) ;
    5559        }
    5660
  • apps/sam/java/src/net/i2p/sam/client/SAMReader.java

    rceb7791 redde533  
    138138                        String name = pair.substring(0, eq);
    139139                        String val = pair.substring(eq+1);
     140                        if (val.length() <= 0) {
     141                            _log.error("Empty value for " + name);
     142                            continue;
     143                        }
    140144                        while ( (val.charAt(0) == '\"') && (val.length() > 0) )
    141145                            val = val.substring(1);
  • apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java

    rceb7791 redde533  
    703703                if (_log.shouldLog(Log.DEBUG))
    704704                    _log.debug("SESSION " + command + " sent");
    705                 if (mode == STREAM) {
    706                     // why only waiting in stream mode?
     705                //if (mode == STREAM) {
    707706                    boolean ok;
    708707                    if (masterMode)
     
    714713                    if (_log.shouldLog(Log.DEBUG))
    715714                        _log.debug("SESSION " + command + " reply found: " + ok);
     715                //}
     716                if (masterMode) {
     717                    // do a bunch more
     718                    req = "SESSION ADD STYLE=STREAM FROM_PORT=99 ID=stream99\n";
     719                    samOut.write(req.getBytes("UTF-8"));
     720                    req = "SESSION ADD STYLE=STREAM FROM_PORT=98 ID=stream98\n";
     721                    samOut.write(req.getBytes("UTF-8"));
     722                    req = "SESSION ADD STYLE=DATAGRAM PORT=9997 LISTEN_PORT=97 ID=dg97\n";
     723                    samOut.write(req.getBytes("UTF-8"));
     724                    req = "SESSION ADD STYLE=DATAGRAM PORT=9996 FROM_PORT=96 ID=dg96\n";
     725                    samOut.write(req.getBytes("UTF-8"));
     726                    req = "SESSION ADD STYLE=RAW PORT=9995 LISTEN_PORT=95 ID=raw95\n";
     727                    samOut.write(req.getBytes("UTF-8"));
     728                    req = "SESSION ADD STYLE=RAW PORT=9994 FROM_PORT=94 LISTEN_PROTOCOL=222 ID=raw94\n";
     729                    samOut.write(req.getBytes("UTF-8"));
     730                    samOut.flush();
    716731                }
    717732                req = "NAMING LOOKUP NAME=ME\n";
Note: See TracChangeset for help on using the changeset viewer.