Changeset 0fc3029


Ignore:
Timestamp:
Jun 27, 2014 8:36:34 PM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
bb9129b
Parents:
d8c8586
Message:

SAM:

Version handling (ticket #1318)

  • MAX param now optional
  • 1-digit versions now accepted for MIN and MAX
  • Use VersionComparator? for version tests
  • Don't require a minor version of 0
  • Fix empty properties check
  • Overrides
  • Prep for version 3.1

Throw exception on null option key (ticket #1325)

Location:
apps/sam/java/src/net/i2p/sam
Files:
5 edited

Legend:

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

    rd8c8586 r0fc3029  
    1818import net.i2p.data.DataHelper;
    1919import net.i2p.util.Log;
     20import net.i2p.util.VersionComparator;
    2021
    2122/**
     
    2425class SAMHandlerFactory {
    2526
     27    private static final String VERSION = "3.0";
    2628
    2729    /**
     
    6769        }
    6870
    69         Properties props;
    70         props = SAMUtils.parseParams(tok);
    71         if (props == null) {
     71        Properties props = SAMUtils.parseParams(tok);
     72        if (props.isEmpty()) {
    7273            throw new SAMException("No parameters in HELLO VERSION message");
    7374        }
     
    8081        String maxVer = props.getProperty("MAX");
    8182        if (maxVer == null) {
    82             throw new SAMException("Missing MAX parameter in HELLO VERSION message");
     83            //throw new SAMException("Missing MAX parameter in HELLO VERSION message");
     84            // MAX optional as of 0.9.14
     85            maxVer = "99.99";
    8386        }
    8487
     
    120123    }
    121124
    122     /* Return the best version we can use, or null on failure */
     125    /*
     126     * @return "x.y" the best version we can use, or null on failure
     127     */
    123128    private static String chooseBestVersion(String minVer, String maxVer) {
    124        
    125         int minMajor = getMajor(minVer), minMinor = getMinor(minVer);
    126         int maxMajor = getMajor(maxVer), maxMinor = getMinor(maxVer);
    127 
    128         // Consistency checks
    129         if ((minMajor == -1) || (minMinor == -1)
    130             || (maxMajor == -1) || (maxMinor == -1)) {
    131             return null;
     129        // in VersionComparator, "3" < "3.0" so
     130        // use comparisons carefully
     131        if (VersionComparator.comp("3.0", minVer) >= 0) {
     132            // Documentation said:
     133            // In order to force protocol version 3.0, the values of $min and $max
     134            // must be "3.0".
     135            int maxcomp = VersionComparator.comp("3", maxVer);
     136            if (maxcomp == 0 || maxVer.equals("3.0"))
     137                return "3.0";  // spoof version
     138            if (maxcomp < 0)
     139                return VERSION;
    132140        }
    133 
    134         if ((minMinor >= 10) || (maxMinor >= 10)) return null ;
    135        
    136         float fminVer = minMajor + (float) minMinor / 10 ;
    137         float fmaxVer = maxMajor + (float) maxMinor / 10 ;
    138        
    139 
    140         if ( ( fminVer <=  3.0 ) && ( fmaxVer >= 3.0 ) ) return "3.0" ;
    141 
    142         if ( ( fminVer <=  2.0 ) && ( fmaxVer >= 2.0 ) ) return "2.0" ;
    143        
    144         if ( ( fminVer <=  1.0 ) && ( fmaxVer >= 1.0 ) ) return "1.0" ;
    145        
     141        if (VersionComparator.comp("2.0", minVer) >= 0 &&
     142            VersionComparator.comp("2", maxVer) <= 0)
     143            return "2.0";
     144        if (VersionComparator.comp("1.0", minVer) >= 0 &&
     145            VersionComparator.comp("1", maxVer) <= 0)
     146            return "1.0";
    146147        return null;
    147148    }
  • apps/sam/java/src/net/i2p/sam/SAMUtils.java

    rd8c8586 r0fc3029  
    160160     *
    161161     * @throws SAMException if the data was formatted incorrectly
    162      * @return Properties with the parsed SAM params
     162     * @return Properties with the parsed SAM params, never null
    163163     */
    164164    public static Properties parseParams(StringTokenizer tok) throws SAMException {
    165         int pos, ntoks = tok.countTokens();
    166         String token, param;
     165        int ntoks = tok.countTokens();
    167166        Properties props = new Properties();
    168167       
    169168        StringBuilder value = new StringBuilder();
    170169        for (int i = 0; i < ntoks; ++i) {
    171             token = tok.nextToken();
    172 
    173             pos = token.indexOf("=");
    174             if (pos == -1) {
     170            String token = tok.nextToken();
     171
     172            int pos = token.indexOf("=");
     173            if (pos <= 0) {
    175174                //_log.debug("Error in params format");
    176                 throw new SAMException("Bad formatting for param [" + token + "]");
    177             }
    178             param = token.substring(0, pos);
     175                if (pos == 0) {
     176                    throw new SAMException("No param specified [" + token + "]");
     177                } else {
     178                    throw new SAMException("Bad formatting for param [" + token + "]");
     179                }
     180            }
     181           
     182            String param = token.substring(0, pos);
    179183            value.append(token.substring(pos+1));
    180184            if (value.length() == 0)
    181                 throw new SAMException("Empty value for param "+param);
     185                throw new SAMException("Empty value for param " + param);
     186           
     187            // FIXME: The following code does not take into account that there
     188            // may have been multiple subsequent space chars in the input that
     189            // StringTokenizer treates as one.
    182190            if (value.charAt(0) == '"') {
    183191                while ( (i < ntoks) && (value.lastIndexOf("\"") <= 0) ) {
  • apps/sam/java/src/net/i2p/sam/SAMv1Handler.java

    rd8c8586 r0fc3029  
    8686    }
    8787
    88   public boolean verifVersion() {
    89     return ( verMajor == 1 && verMinor == 0 ) ;
    90   }
     88    public boolean verifVersion() {
     89        return (verMajor == 1);
     90    }
    9191
    9292    public void handle() {
  • apps/sam/java/src/net/i2p/sam/SAMv2Handler.java

    rd8c8586 r0fc3029  
    5656                }
    5757               
     58                @Override
    5859                public boolean verifVersion()
    5960                {
    60                         return (verMajor == 2 && verMinor == 0) ;
     61                        return (verMajor == 2);
    6162                }
    6263
  • apps/sam/java/src/net/i2p/sam/SAMv3Handler.java

    rd8c8586 r0fc3029  
    8989        }
    9090
     91        @Override
    9192        public boolean verifVersion()
    9293        {
    93                 return (verMajor == 3 && verMinor == 0) ;
     94                return (verMajor == 3);
    9495        }
    9596
Note: See TracChangeset for help on using the changeset viewer.