Changeset 4f262f6 for apps/addressbook


Ignore:
Timestamp:
Apr 21, 2016 2:37:38 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
55de82b
Parents:
34e3909
Message:

Addressbook: Use new NamingService? API methods in action handling

Blockfile: Cleanup unused code

Location:
apps/addressbook/java/src/net/i2p/addressbook
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • apps/addressbook/java/src/net/i2p/addressbook/Daemon.java

    r34e3909 r4f262f6  
    255255                                    String poldname = hprops.getProperty(HostTxtEntry.PROP_OLDNAME);
    256256                                    if (poldname != null) {
    257                                         Destination pod = router.lookup(poldname);
     257                                        List<Destination> pod = router.lookupAll(poldname);
    258258                                        if (pod == null) {
    259259                                            // we didn't have the old one, so we'll add the new one
    260                                         } else if (pod.equals(dest)) {
     260                                        } else if (pod.contains(dest)) {
    261261                                            // checks out, so we'll add the new one
    262262                                        } else {
     
    298298                                        }
    299299                                        Destination pod = new Destination(polddest);
    300                                         Destination pod2 = router.lookup(poldname);
     300                                        List<Destination> pod2 = router.lookupAll(poldname);
    301301                                        if (pod2 == null) {
    302302                                            // we didn't have the old name
    303                                         } else if (pod.equals(pod2)) {
     303                                        } else if (pod2.contains(pod)) {
    304304                                            // checks out, so verify the inner sig
    305305                                            if (!he.hasValidInnerSig()) {
     
    331331                                } else if (action.equals(HostTxtEntry.ACTION_CHANGEDEST)) {
    332332                                    // change destination on an existing entry
     333                                    // This removes all previous destinations under that hostname,
     334                                    // is this what we want?
    333335                                    String polddest = hprops.getProperty(HostTxtEntry.PROP_OLDDEST);
    334336                                    if (polddest != null) {
     
    370372                                } else if (action.equals(HostTxtEntry.ACTION_CHANGENAME)) {
    371373                                    // Delete old name, replace with new
     374                                    // This removes all previous destinations under that hostname,
     375                                    // is this what we want?
    372376                                    if (isKnown) {
    373377                                        old++;
     
    376380                                    String poldname = hprops.getProperty(HostTxtEntry.PROP_OLDNAME);
    377381                                    if (poldname != null) {
    378                                         Destination pod = router.lookup(poldname);
     382                                        List<Destination> pod = router.lookupAll(poldname);
    379383                                        if (pod == null) {
    380384                                            // we didn't have the old name
    381                                         } else if (pod.equals(dest)) {
     385                                        } else if (pod.contains(dest)) {
    382386                                            // checks out, so we'll delete it
    383387                                            if (knownNames != null)
    384388                                                knownNames.remove(poldname);
    385                                             boolean success = router.remove(poldname);
     389                                            boolean success = router.remove(poldname, dest);
    386390                                            if (success)
    387391                                                deleted++;
     
    400404                                                if (publishedNS == null)
    401405                                                    publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
    402                                                 success = publishedNS.remove(poldname);
     406                                                success = publishedNS.remove(poldname, dest);
    403407                                                if (log != null && !success)
    404408                                                    log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + poldname);
     
    432436                                    if (polddest != null && poldname != null) {
    433437                                        Destination pod = new Destination(polddest);
    434                                         Destination pod2 = router.lookup(poldname);
    435                                         if (pod.equals(pod2)) {
    436                                             if (knownNames != null)
     438                                        List<Destination> pod2 = router.lookupAll(poldname);
     439                                        if (pod2 != null && pod2.contains(pod)) {
     440                                            if (knownNames != null && pod2.size() == 1)
    437441                                                knownNames.remove(poldname);
    438                                             boolean success = router.remove(poldname);
     442                                            boolean success = router.remove(poldname, pod);
    439443                                            if (success)
    440444                                                deleted++;
     
    453457                                                if (publishedNS == null)
    454458                                                    publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
    455                                                 success = publishedNS.remove(poldname);
     459                                                success = publishedNS.remove(poldname, pod);
    456460                                                if (log != null && !success)
    457461                                                    log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + poldname);
     
    486490                                        String poldname = hprops.getProperty(HostTxtEntry.PROP_NAME);
    487491                                        if (poldname != null) {
    488                                             Destination pod2 = router.lookup(poldname);
    489                                             if (pod.equals(pod2)) {
     492                                            List<Destination> pod2 = router.lookupAll(poldname);
     493                                            if (pod2 != null && pod2.contains(pod)) {
    490494                                                if (knownNames != null)
    491495                                                    knownNames.remove(poldname);
    492                                                 boolean success = router.remove(poldname);
     496                                                boolean success = router.remove(poldname, pod);
    493497                                                if (success)
    494498                                                    deleted++;
     
    507511                                                    if (publishedNS == null)
    508512                                                        publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
    509                                                     success = publishedNS.remove(poldname);
     513                                                    success = publishedNS.remove(poldname, pod);
    510514                                                    if (log != null && !success)
    511515                                                        log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + poldname);
     
    531535                                            rev2 = rev;
    532536                                            // forward check in case hash collision or something
    533                                             Destination fwd = router.lookup(rev);
    534                                             if (!pod.equals(fwd))
     537                                            List<Destination> fwd = router.lookupAll(rev);
     538                                            if (!fwd.contains(pod))
    535539                                                break;  // can't go around again, fail
    536540                                            if (knownNames != null)
    537541                                                knownNames.remove(rev);
    538                                             boolean success = router.remove(rev);
     542                                            boolean success = router.remove(rev, pod);
    539543                                            if (success)
    540544                                                deleted++;
     
    553557                                                if (publishedNS == null)
    554558                                                    publishedNS = new SingleFileNamingService(I2PAppContext.getGlobalContext(), published.getAbsolutePath());
    555                                                 success = publishedNS.remove(rev);
     559                                                success = publishedNS.remove(rev, pod);
    556560                                                if (log != null && !success)
    557561                                                    log.append("Remove from published address book " + published.getAbsolutePath() + " failed for " + rev);
  • apps/addressbook/java/src/net/i2p/addressbook/HostTxtEntry.java

    r34e3909 r4f262f6  
    33import java.io.BufferedWriter;
    44import java.io.IOException;
     5import java.io.StringWriter;
     6import java.io.Writer;
    57import java.util.Map;
    68
     
    1820import java.io.OutputStreamWriter;
    1921import java.io.StringWriter;
     22import net.i2p.data.Base32;
    2023import net.i2p.data.PrivateKeyFile;
    2124import net.i2p.data.SigningPrivateKey;
     25import net.i2p.util.RandomSource;
    2226
    2327
     
    98102     * @throws IllegalArgumentException on dup key and other errors
    99103     */
    100     private OrderedProperties parseProps(String line) throws IllegalArgumentException {
     104    private static OrderedProperties parseProps(String line) throws IllegalArgumentException {
    101105        line = line.trim();
    102106        OrderedProperties rv = new OrderedProperties();
     
    116120    }
    117121
     122    /**
     123     * Write as a standard line name=dest[#!k1=v1#k2=v2...]
     124     * Includes newline.
     125     */
    118126    public void write(BufferedWriter out) throws IOException {
    119127        out.write(name);
    120128        out.write(KV_SEPARATOR);
    121129        out.write(dest);
    122         if (props != null && props.size() > 0) {
    123             boolean started = false;
    124             for (Map.Entry<Object, Object> e : props.entrySet()) {
    125                 if (started) {
    126                     out.write(PROP_SEPARATOR);
    127                 } else {
    128                     started = true;
    129                     out.write(PROPS_SEPARATOR);
    130                 }
    131                 String k = (String) e.getKey();
    132                 String v = (String) e.getValue();
    133                 out.write(k);
    134                 out.write(KV_SEPARATOR);
    135                 out.write(v);
    136             }
    137         }
     130        writeProps(out, false, false);
    138131        out.newLine();
     132    }
     133
     134    /**
     135     * Write as a "remove" line #!olddest=dest#oldname=name#k1=v1#k2=v2...]
     136     * Includes newline.
     137     * Must have been constructed with non-null properties.
     138     */
     139    public void writeRemove(BufferedWriter out) throws IOException {
     140        if (props == null)
     141            throw new IllegalStateException();
     142        props.setProperty(PROP_OLDNAME, name);
     143        props.setProperty(PROP_OLDDEST, dest);
     144        writeProps(out, false, false);
     145        out.newLine();
     146        props.remove(PROP_OLDNAME);
     147        props.remove(PROP_OLDDEST);
     148    }
     149
     150    /**
     151     * Write the props part (if any) only, without newline
     152     */
     153    private void writeProps(Writer out, boolean omitSig, boolean omitOldSig) throws IOException {
     154        if (props == null)
     155            return;
     156        boolean started = false;
     157        for (Map.Entry<Object, Object> e : props.entrySet()) {
     158            String k = (String) e.getKey();
     159            if (omitSig && k.equals(PROP_SIG))
     160                continue;
     161            if (omitOldSig && k.equals(PROP_OLDSIG))
     162                continue;
     163            if (started) {
     164                out.write(PROP_SEPARATOR);
     165            } else {
     166                started = true;
     167                out.write(PROPS_SEPARATOR);
     168            }
     169            String v = (String) e.getValue();
     170            out.write(k);
     171            out.write(KV_SEPARATOR);
     172            out.write(v);
     173        }
    139174    }
    140175
     
    147182        if (!isValidated) {
    148183            isValidated = true;
    149             StringBuilder buf = new StringBuilder(1024);
    150             String sig = null;
     184            StringWriter buf = new StringWriter(1024);
     185            String sig = props.getProperty(PROP_SIG);
     186            if (sig == null)
     187                return false;
    151188            buf.append(name);
    152189            buf.append(KV_SEPARATOR);
    153190            buf.append(dest);
    154             boolean started = false;
    155             for (Map.Entry<Object, Object> e : props.entrySet()) {
    156                 String k = (String) e.getKey();
    157                 String v = (String) e.getValue();
    158                 if (k.equals(PROP_SIG)) {
    159                     if (sig != null)
    160                         return false;
    161                     sig = v;
    162                     // remove from the written data
    163                     continue;
    164                 }
    165                 if (started) {
    166                     buf.append(PROP_SEPARATOR);
    167                 } else {
    168                     started = true;
    169                     buf.append(PROPS_SEPARATOR);
    170                 }
    171                 buf.append(k);
    172                 buf.append(KV_SEPARATOR);
    173                 buf.append(v);
    174             }
    175             if (sig == null)
    176                 return false;
     191            try {
     192                writeProps(buf, true, false);
     193            } catch (IOException ioe) {
     194                // won't happen
     195                return false;
     196            }
    177197            byte[] sdata = Base64.decode(sig);
    178198            if (sdata == null)
     
    208228        // don't cache result
    209229        if (true) {
    210             StringBuilder buf = new StringBuilder(1024);
    211             String sig = null;
    212             String olddest = null;
     230            StringWriter buf = new StringWriter(1024);
     231            String sig = props.getProperty(PROP_OLDSIG);
     232            String olddest = props.getProperty(PROP_OLDDEST);
     233            if (sig == null || olddest == null)
     234                return false;
    213235            buf.append(name);
    214236            buf.append(KV_SEPARATOR);
    215237            buf.append(dest);
    216             boolean started = false;
    217             for (Map.Entry<Object, Object> e : props.entrySet()) {
    218                 String k = (String) e.getKey();
    219                 String v = (String) e.getValue();
    220                 if (k.equals(PROP_SIG)) {
    221                     continue;
    222                 }
    223                 if (k.equals(PROP_OLDSIG)) {
    224                     if (sig != null)
    225                         return false;
    226                     sig = v;
    227                     // remove from the written data
    228                     continue;
    229                 }
    230                 if (k.equals(PROP_OLDDEST)) {
    231                     if (olddest != null)
    232                         return false;
    233                     olddest = v;
    234                 }
    235                 if (started) {
    236                     buf.append(PROP_SEPARATOR);
    237                 } else {
    238                     started = true;
    239                     buf.append(PROPS_SEPARATOR);
    240                 }
    241                 buf.append(k);
    242                 buf.append(KV_SEPARATOR);
    243                 buf.append(v);
    244             }
    245             if (sig == null || olddest == null)
    246                 return false;
     238            try {
     239                writeProps(buf, true, true);
     240            } catch (IOException ioe) {
     241                // won't happen
     242                return false;
     243            }
    247244            byte[] sdata = Base64.decode(sig);
    248245            if (sdata == null)
     
    310307        if (props == null)
    311308            throw new IllegalStateException();
    312         StringBuilder buf = new StringBuilder(1024);
     309        if (props.containsKey(sigprop))
     310            throw new IllegalStateException();
     311        StringWriter buf = new StringWriter(1024);
    313312        buf.append(name);
    314313        buf.append(KV_SEPARATOR);
    315314        buf.append(dest);
    316         boolean started = false;
    317         for (Map.Entry<Object, Object> e : props.entrySet()) {
    318             String k = (String) e.getKey();
    319             String v = (String) e.getValue();
    320             if (k.equals(sigprop))
    321                 throw new IllegalStateException();
    322             if (started) {
    323                 buf.append(PROP_SEPARATOR);
    324             } else {
    325                 started = true;
    326                 buf.append(PROPS_SEPARATOR);
    327             }
    328             buf.append(k);
    329             buf.append(KV_SEPARATOR);
    330             buf.append(v);
     315        try {
     316            writeProps(buf, false, false);
     317        } catch (IOException ioe) {
     318            throw new IllegalStateException(ioe);
    331319        }
    332320        Signature s = DSAEngine.getInstance().sign(DataHelper.getUTF8(buf.toString()), spk);
     
    337325
    338326    public static void main(String[] args) throws Exception {
     327        int astart = 0;
     328        if (args.length > 0 && args[0].equals("-i"))
     329            astart++;
     330        OrderedProperties props = new OrderedProperties();
     331        for (int i = astart; i < args.length; i++) {
     332            int eq = args[i].indexOf("=");
     333            props.setProperty(args[i].substring(0, eq), args[i].substring(eq + 1));
     334        }
     335        props.setProperty("zzzz", "zzzzzzzzzzzzzzz");
    339336        // outer
    340337        File f = new File("tmp-eepPriv.dat");
    341         // inner
    342         File f2 = new File("tmp-eepPriv2.dat");
    343338        PrivateKeyFile pkf = new PrivateKeyFile(f);
    344         PrivateKeyFile pkf2 = new PrivateKeyFile(f2);
    345339        pkf.createIfAbsent(SigType.EdDSA_SHA512_Ed25519);
    346         pkf2.createIfAbsent(SigType.DSA_SHA1);
    347         OrderedProperties props = new OrderedProperties();
    348         props.setProperty("c", "ccccccccccc");
    349         props.setProperty("a", "aaaa");
    350         props.setProperty(PROP_OLDDEST, pkf2.getDestination().toBase64());
    351         HostTxtEntry he = new HostTxtEntry("foo.i2p", pkf.getDestination().toBase64(), props);
     340        f.delete();
     341        PrivateKeyFile pkf2;
     342        if (astart != 0) {
     343            // inner
     344            File f2 = new File("tmp-eepPriv2.dat");
     345            pkf2 = new PrivateKeyFile(f2);
     346            pkf2.createIfAbsent(SigType.DSA_SHA1);
     347            f2.delete();
     348            props.setProperty(PROP_OLDDEST, pkf2.getDestination().toBase64());
     349        } else {
     350            pkf2 = null;
     351        }
     352        byte[] rand = new byte[5];
     353        RandomSource.getInstance().nextBytes(rand);
     354        String host = Base32.encode(rand) + ".i2p";
     355        HostTxtEntry he = new HostTxtEntry(host, pkf.getDestination().toBase64(), props);
    352356        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
    353         out.write("Before signing:\n");
     357        //out.write("Before signing:\n");
     358        //he.write(out);
     359        //out.flush();
     360        SigningPrivateKey priv = pkf.getSigningPrivKey();
     361        if (astart != 0) {
     362            SigningPrivateKey priv2 = pkf2.getSigningPrivKey();
     363            he.signInner(priv2);
     364            //out.write("After signing inner:\n");
     365            //he.write(out);
     366        }
     367        he.sign(priv);
     368        //out.write("After signing:\n");
    354369        he.write(out);
    355370        out.flush();
    356         SigningPrivateKey priv = pkf.getSigningPrivKey();
    357         SigningPrivateKey priv2 = pkf2.getSigningPrivKey();
    358         he.signInner(priv2);
    359         out.write("After signing inner:\n");
    360         he.write(out);
    361         he.sign(priv);
    362         out.write("After signing:\n");
    363         he.write(out);
    364         out.flush();
    365         System.out.println("Orig has valid inner sig? " + he.hasValidInnerSig());
    366         System.out.println("Orig has valid sig? " + he.hasValidSig());
     371        if (astart > 0 && !he.hasValidInnerSig())
     372            throw new IllegalStateException("Inner fail 1");
     373        if (!he.hasValidSig())
     374            throw new IllegalStateException("Outer fail 1");
    367375        // now create 2nd, read in
    368376        StringWriter sw = new StringWriter(1024);
     
    372380        String line = sw.toString();
    373381        line = line.substring(line.indexOf(PROPS_SEPARATOR) + 2);
    374         HostTxtEntry he2 = new HostTxtEntry("foo.i2p", pkf.getDestination().toBase64(), line);
    375         System.out.println("Dupl. has valid inner sig? " + he2.hasValidInnerSig());
    376         System.out.println("Dupl. has valid sig? " + he2.hasValidSig());
    377         f.delete();
    378         f2.delete();
     382        HostTxtEntry he2 = new HostTxtEntry(host, pkf.getDestination().toBase64(), line);
     383        if (astart > 0 && !he2.hasValidInnerSig())
     384            throw new IllegalStateException("Inner fail 2");
     385        if (!he2.hasValidSig())
     386            throw new IllegalStateException("Outer fail 2");
     387        //out.write("Test passed\n");
     388        //out.flush();
    379389    }
    380390}
  • apps/addressbook/java/src/net/i2p/addressbook/HostTxtParser.java

    r34e3909 r4f262f6  
    218218            System.out.println("Host: " + e.getName() +
    219219                               "\nDest: " + e.getDest() +
    220                                "\nValid? " + e.hasValidSig());
     220                               "\nAction: " + (e.getProps() != null ? e.getProps().getProperty("action") : "(none)") +
     221                               "\nValid Inner? " + e.hasValidInnerSig() +
     222                               "\nValid? " + e.hasValidSig() +
     223                               '\n');
    221224        }
    222225    }
Note: See TracChangeset for help on using the changeset viewer.