Search in sources :

Example 1 with NewsMetadata

use of net.i2p.router.news.NewsMetadata in project i2p.i2p by i2p.

the class NewsFetcher method outputOldNewsXML.

/**
 *  Output in the old format.
 *
 *  @since 0.9.17
 */
private void outputOldNewsXML(NewsMetadata data, List<NewsEntry> entries, String sudVersion, String signingKeyName, File to) throws IOException {
    NewsMetadata.Release latestRelease = data.releases.get(0);
    Writer out = null;
    try {
        out = new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(to), "UTF-8"));
        out.write("<!--\n");
        // update metadata in old format
        out.write("<i2p.release ");
        if (latestRelease.i2pVersion != null)
            out.write(" version=\"" + latestRelease.i2pVersion + '"');
        if (latestRelease.minVersion != null)
            out.write(" minVersion=\"" + latestRelease.minVersion + '"');
        if (latestRelease.minJavaVersion != null)
            out.write(" minJavaVersion=\"" + latestRelease.minJavaVersion + '"');
        String su3Torrent = "";
        String su2Torrent = "";
        for (NewsMetadata.Update update : latestRelease.updates) {
            if (update.torrent != null) {
                if ("su3".equals(update.type))
                    su3Torrent = update.torrent;
                else if ("su2".equals(update.type))
                    su2Torrent = update.torrent;
            }
        }
        if (!su2Torrent.isEmpty())
            out.write(" su2Torrent=\"" + su2Torrent + '"');
        if (!su3Torrent.isEmpty())
            out.write(" su3Torrent=\"" + su3Torrent + '"');
        out.write("/>\n");
        // su3 and feed metadata for debugging
        out.write("** News version:\t" + DataHelper.stripHTML(sudVersion) + '\n');
        out.write("** Signed by:\t" + signingKeyName + '\n');
        out.write("** Feed:\t" + DataHelper.stripHTML(data.feedTitle) + '\n');
        out.write("** Feed ID:\t" + DataHelper.stripHTML(data.feedID) + '\n');
        out.write("** Feed Date:\t" + (new Date(data.feedUpdated)) + '\n');
        out.write("-->\n");
        if (entries == null)
            return;
        DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT);
        // the router sets the JVM time zone to UTC but saves the original here so we can get it
        fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context));
        for (NewsEntry e : entries) {
            if (e.title == null || e.content == null)
                continue;
            Date date = new Date(e.updated);
            out.write("<!-- Entry Date: " + date + " -->\n");
            out.write("<h3>");
            out.write(fmt.format(date));
            out.write(": ");
            out.write(e.title);
            out.write("</h3>\n");
            out.write(e.content);
            out.write("\n\n");
        }
    } finally {
        if (out != null)
            try {
                out.close();
            } catch (IOException ioe) {
            }
    }
}
Also used : NewsMetadata(net.i2p.router.news.NewsMetadata) DateFormat(java.text.DateFormat) OutputStreamWriter(java.io.OutputStreamWriter) SecureFileOutputStream(net.i2p.util.SecureFileOutputStream) IOException(java.io.IOException) NewsEntry(net.i2p.router.news.NewsEntry) Writer(java.io.Writer) OutputStreamWriter(java.io.OutputStreamWriter) BufferedWriter(java.io.BufferedWriter) Date(java.util.Date) RFC822Date(net.i2p.util.RFC822Date) BufferedWriter(java.io.BufferedWriter)

Example 2 with NewsMetadata

use of net.i2p.router.news.NewsMetadata in project i2p.i2p by i2p.

the class NewsFetcher method processSU3.

/**
 *  Process the fetched su3 news file _tempFile.
 *  Handles 3 types of contained files: xml.gz (preferred), xml, and html (old format fake xml)
 *
 *  @return the temp file contining the HTML-format news.xml
 *  @since 0.9.17
 */
private File processSU3() throws IOException {
    SU3File su3 = new SU3File(_context, _tempFile);
    // real xml, maybe gz, maybe not
    File to1 = new File(_context.getTempDir(), "tmp-" + _context.random().nextInt() + ".xml");
    // real xml
    File to2 = new File(_context.getTempDir(), "tmp2-" + _context.random().nextInt() + ".xml");
    try {
        su3.verifyAndMigrate(to1);
        int type = su3.getFileType();
        if (su3.getContentType() != SU3File.CONTENT_NEWS)
            throw new IOException("bad content type: " + su3.getContentType());
        if (type == SU3File.TYPE_HTML)
            return to1;
        if (type != SU3File.TYPE_XML && type != SU3File.TYPE_XML_GZ)
            throw new IOException("bad file type: " + type);
        File xml;
        if (type == SU3File.TYPE_XML_GZ) {
            gunzip(to1, to2);
            xml = to2;
            to1.delete();
        } else {
            xml = to1;
        }
        NewsXMLParser parser = new NewsXMLParser(_context);
        Node root = parser.parse(xml);
        xml.delete();
        NewsMetadata data = parser.getMetadata();
        List<NewsEntry> entries = parser.getEntries();
        // add entries to the news manager
        ClientAppManager cmgr = _context.clientAppManager();
        if (cmgr != null) {
            NewsManager nmgr = (NewsManager) cmgr.getRegisteredApp(NewsManager.APP_NAME);
            if (nmgr != null) {
                nmgr.addEntries(entries);
                List<Node> nodes = NewsXMLParser.getNodes(root, "entry");
                nmgr.storeEntries(nodes);
            }
        }
        // Persist any new CRL entries
        List<CRLEntry> crlEntries = parser.getCRLEntries();
        if (crlEntries != null)
            persistCRLEntries(crlEntries);
        else
            _log.info("No CRL entries found in news feed");
        // Block any new blocklist entries
        BlocklistEntries ble = parser.getBlocklistEntries();
        if (ble != null && ble.isVerified())
            processBlocklistEntries(ble);
        else
            _log.info("No blocklist entries found in news feed");
        // store entries and metadata in old news.xml format
        String sudVersion = su3.getVersionString();
        String signingKeyName = su3.getSignerString();
        File to3 = new File(_context.getTempDir(), "tmp3-" + _context.random().nextInt() + ".xml");
        outputOldNewsXML(data, entries, sudVersion, signingKeyName, to3);
        return to3;
    } finally {
        to2.delete();
    }
}
Also used : NewsMetadata(net.i2p.router.news.NewsMetadata) Node(org.cybergarage.xml.Node) IOException(java.io.IOException) CRLEntry(net.i2p.router.news.CRLEntry) SU3File(net.i2p.crypto.SU3File) NewsEntry(net.i2p.router.news.NewsEntry) ClientAppManager(net.i2p.app.ClientAppManager) NewsXMLParser(net.i2p.router.news.NewsXMLParser) NewsManager(net.i2p.router.news.NewsManager) BlocklistEntries(net.i2p.router.news.BlocklistEntries) SU3File(net.i2p.crypto.SU3File) SecureFile(net.i2p.util.SecureFile) File(java.io.File)

Aggregations

IOException (java.io.IOException)2 NewsEntry (net.i2p.router.news.NewsEntry)2 NewsMetadata (net.i2p.router.news.NewsMetadata)2 BufferedWriter (java.io.BufferedWriter)1 File (java.io.File)1 OutputStreamWriter (java.io.OutputStreamWriter)1 Writer (java.io.Writer)1 DateFormat (java.text.DateFormat)1 Date (java.util.Date)1 ClientAppManager (net.i2p.app.ClientAppManager)1 SU3File (net.i2p.crypto.SU3File)1 BlocklistEntries (net.i2p.router.news.BlocklistEntries)1 CRLEntry (net.i2p.router.news.CRLEntry)1 NewsManager (net.i2p.router.news.NewsManager)1 NewsXMLParser (net.i2p.router.news.NewsXMLParser)1 RFC822Date (net.i2p.util.RFC822Date)1 SecureFile (net.i2p.util.SecureFile)1 SecureFileOutputStream (net.i2p.util.SecureFileOutputStream)1 Node (org.cybergarage.xml.Node)1