package net.i2p.router.update;
import java.net.URI;
import java.util.List;
import net.i2p.router.RouterContext;
import net.i2p.router.util.RFC822Date;
import net.i2p.router.web.ConfigUpdateHandler;
import net.i2p.update.*;
import net.i2p.util.EepHead;
import net.i2p.util.Log;
import net.i2p.util.PortMapper;
import net.i2p.util.SystemVersion;
/**
* Does a simple EepHead to get the last-modified header.
* Moved from NewsFetcher and turned into an UpdateTask.
*
* Overrides UpdateRunner for convenience, does not use super's Eepget StatusListener
*
* @since 0.9.4
*/
class UnsignedUpdateChecker extends UpdateRunner {
private final long _ms;
private boolean _unsignedUpdateAvailable;
public UnsignedUpdateChecker(RouterContext ctx, ConsoleUpdateManager mgr,
List<URI> uris, long lastUpdateTime) {
super(ctx, mgr, UpdateType.ROUTER_UNSIGNED, uris);
_ms = lastUpdateTime;
}
@Override
public void run() {
_isRunning = true;
boolean success = false;
try {
success = fetchUnsignedHead();
} catch (Throwable t) {
_mgr.notifyTaskFailed(this, "", t);
} finally {
_mgr.notifyCheckComplete(this, _unsignedUpdateAvailable, success);
_isRunning = false;
}
}
/**
* HEAD the update url, and if the last-mod time is newer than the last update we
* downloaded, as stored in the properties, then we download it using eepget.
*/
private boolean fetchUnsignedHead() {
if (_urls.isEmpty())
return false;
_currentURI = _urls.get(0);
String url = _currentURI.toString();
// assume always proxied for now
//boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST);
int proxyPort = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT);
if (proxyPort == ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT &&
proxyHost.equals(ConfigUpdateHandler.DEFAULT_PROXY_HOST) &&
_context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY) < 0) {
String msg = _t("HTTP client proxy tunnel must be running");
if (_log.shouldWarn())
_log.warn(msg);
updateStatus("<b>" + msg + "</b>");
return false;
}
//updateStatus("<b>" + _t("Checking for development build update") + "</b>");
try {
EepHead get = new EepHead(_context, proxyHost, proxyPort, 0, url);
if (get.fetch()) {
String lastmod = get.getLastModified();
if (lastmod != null) {
long modtime = RFC822Date.parse822Date(lastmod);
if (modtime <= 0) return false;
if (_ms <= 0) return false;
if (modtime > _ms) {
String newVersion = Long.toString(modtime);
if (SystemVersion.isJava7()) {
_unsignedUpdateAvailable = true;
_mgr.notifyVersionAvailable(this, _urls.get(0), getType(), "", getMethod(), _urls,
newVersion, "");
} else {
String ourJava = System.getProperty("java.version");
String msg = _mgr._t("Requires Java version {0} but installed Java version is {1}", "1.7", ourJava);
_log.logAlways(Log.WARN, "Cannot update to version " + newVersion + ": " + msg);
_mgr.notifyVersionConstraint(this, _urls.get(0), getType(), "", newVersion, msg);
}
}
}
return true;
}
} catch (Throwable t) {
_log.error("Error fetching the update", t);
}
return false;
}
}