Changeset 52c9bf6


Ignore:
Timestamp:
Apr 28, 2016 9:55:17 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
d885e00
Parents:
03adda3
Message:

News: Parse and store CRLs in news feed

Location:
apps/routerconsole/java/src/net/i2p/router
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/news/NewsXMLParser.java

    r03adda3 r52c9bf6  
    3333    private final Log _log;
    3434    private List<NewsEntry> _entries;
     35    private List<CRLEntry> _crlEntries;
    3536    private NewsMetadata _metadata;
    3637    private XHTMLMode _mode;
     
    146147    }
    147148
     149    /**
     150     *  The news CRL entries.
     151     *  Must call parse() first.
     152     *
     153     *  @return unsorted, null if none
     154     *  @since 0.9.26
     155     */
     156    public List<CRLEntry> getCRLEntries() {
     157        return _crlEntries;
     158    }
     159
    148160    private void extract(Node root) throws I2PParserException {
    149161        if (!root.getName().equals("feed"))
     
    151163        _metadata = extractNewsMetadata(root);
    152164        _entries = extractNewsEntries(root);
     165        _crlEntries = extractCRLEntries(root);
    153166    }
    154167
     
    253266    /**
    254267     *  This does not check for any missing values.
    255      *  Any fields in any NewsEntry may be null.
     268     *  Any field in any NewsEntry may be null.
    256269     */
    257270    private List<NewsEntry> extractNewsEntries(Node feed) throws I2PParserException {
     
    352365
    353366    /**
     367     *  This does not check for any missing values.
     368     *  Any field in any CRLEntry may be null.
     369     *
     370     *  @return null if none
     371     *  @since 0.9.26
     372     */
     373    private List<CRLEntry> extractCRLEntries(Node feed) throws I2PParserException {
     374        Node rev = feed.getNode("i2p:revocations");
     375        if (rev == null)
     376            return null;
     377        List<Node> entries = getNodes(rev, "i2p:crl");
     378        if (entries.isEmpty())
     379            return null;
     380        List<CRLEntry> rv = new ArrayList<CRLEntry>(entries.size());
     381        for (Node entry : entries) {
     382            CRLEntry e = new CRLEntry();
     383            String a = entry.getAttributeValue("id");
     384            if (a.length() > 0)
     385                e.id = a;
     386            a = entry.getAttributeValue("updated");
     387            if (a.length() > 0) {
     388                long time = RFC3339Date.parse3339Date(a.trim());
     389                if (time > 0)
     390                    e.updated = time;
     391            }
     392            a = entry.getValue();
     393            if (a != null)
     394                e.data = a.trim();
     395            rv.add(e);
     396        }
     397        return rv;
     398    }
     399
     400    /**
    354401     *  Helper to get all Nodes matching the name
    355402     *
  • apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java

    r03adda3 r52c9bf6  
    2424import net.i2p.crypto.SU3File;
    2525import net.i2p.crypto.TrustedUpdate;
     26import net.i2p.data.Base64;
    2627import net.i2p.data.DataHelper;
    2728import net.i2p.router.RouterContext;
    2829import net.i2p.router.RouterVersion;
     30import net.i2p.router.news.CRLEntry;
    2931import net.i2p.router.news.NewsEntry;
    3032import net.i2p.router.news.NewsManager;
     
    4244import net.i2p.util.PortMapper;
    4345import net.i2p.util.ReusableGZIPInputStream;
     46import net.i2p.util.SecureFile;
    4447import net.i2p.util.SecureFileOutputStream;
    4548import net.i2p.util.SSLEepGet;
     
    510513                }
    511514            }
     515            // Persist any new CRL entries
     516            List<CRLEntry> crlEntries = parser.getCRLEntries();
     517            if (crlEntries != null)
     518                persistCRLEntries(crlEntries);
     519            else
     520                _log.info("No CRL entries found in news feed");
    512521            // store entries and metadata in old news.xml format
    513522            String sudVersion = su3.getVersionString();
     
    543552            ReusableGZIPInputStream.release(in);
    544553        }
     554    }
     555
     556    /**
     557     *  Output any updated CRL entries
     558     *
     559     *  @since 0.9.26
     560     */
     561    private void persistCRLEntries(List<CRLEntry> entries) {
     562        File dir = new SecureFile(_context.getConfigDir(), "certificates");
     563        if (!dir.exists() && !dir.mkdir()) {
     564            _log.error("Failed to create CRL directory " + dir);
     565            return;
     566        }
     567        dir = new SecureFile(dir, "revocations");
     568        if (!dir.exists() && !dir.mkdir()) {
     569            _log.error("Failed to create CRL directory " + dir);
     570            return;
     571        }
     572        int i = 0;
     573        for (CRLEntry e : entries) {
     574            if (e.id == null || e.data == null) {
     575                if (_log.shouldWarn())
     576                    _log.warn("Bad CRL entry received");
     577                continue;
     578            }
     579            byte[] bid = DataHelper.getUTF8(e.id);
     580            byte[] hash = new byte[32];
     581            _context.sha().calculateHash(bid, 0, bid.length, hash, 0);
     582            String name = "crl-" + Base64.encode(hash) + ".crl";
     583            File f = new File(dir, name);
     584            if (f.exists() && f.lastModified() >= e.updated)
     585                continue;
     586            OutputStream out = null;
     587            try {
     588                out = new SecureFileOutputStream(f);
     589                out.write(DataHelper.getUTF8(e.data));
     590            } catch (IOException ioe) {
     591                _log.error("Failed to write CRL", ioe);
     592            } finally {
     593                if (out != null) try { out.close(); } catch (IOException ioe) {}
     594            }
     595            f.setLastModified(e.updated);
     596            i++;
     597        }
     598        if (i > 0)
     599            _log.logAlways(Log.WARN, "Stored " + i + " new CRL " + (i > 1 ? "entries" : "entry"));
    545600    }
    546601
Note: See TracChangeset for help on using the changeset viewer.