forked from I2P_Developers/i2p.i2p
99 lines
4.0 KiB
Java
99 lines
4.0 KiB
Java
package net.i2p.router.update;
|
|
|
|
import java.io.File;
|
|
import java.net.URI;
|
|
import java.util.List;
|
|
|
|
import net.i2p.crypto.TrustedUpdate;
|
|
import net.i2p.router.RouterContext;
|
|
import net.i2p.router.web.ConfigUpdateHandler;
|
|
import net.i2p.update.*;
|
|
import net.i2p.util.PartialEepGet;
|
|
import net.i2p.util.PortMapper;
|
|
|
|
/**
|
|
* Check for an updated version of a plugin.
|
|
* A plugin is a standard .sud file with a 40-byte signature,
|
|
* a 16-byte version, and a .zip file.
|
|
*
|
|
* So we get the current version and update URL for the installed plugin,
|
|
* then fetch the first 56 bytes of the URL, extract the version,
|
|
* and compare.
|
|
*
|
|
* Moved from web/ and turned into an UpdateTask.
|
|
*
|
|
* @since 0.7.12
|
|
*/
|
|
class PluginUpdateChecker extends UpdateRunner {
|
|
private final String _appName;
|
|
private final String _oldVersion;
|
|
|
|
public PluginUpdateChecker(RouterContext ctx, ConsoleUpdateManager mgr,
|
|
List<URI> uris, String appName, String oldVersion ) {
|
|
super(ctx, mgr, UpdateType.PLUGIN, uris, oldVersion);
|
|
if (!uris.isEmpty())
|
|
_currentURI = uris.get(0);
|
|
_appName = appName;
|
|
_oldVersion = oldVersion;
|
|
}
|
|
|
|
@Override
|
|
public String getID() { return _appName; }
|
|
|
|
@Override
|
|
protected void update() {
|
|
// must be set for super
|
|
_isPartial = true;
|
|
// use the same settings as for updater
|
|
// always proxy, or else FIXME
|
|
//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 = ConfigUpdateHandler.proxyPort(_context);
|
|
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>");
|
|
_mgr.notifyCheckComplete(this, false, false);
|
|
return;
|
|
}
|
|
updateStatus("<b>" + _t("Checking for update of plugin {0}", _appName) + "</b>");
|
|
_baos.reset();
|
|
try {
|
|
_get = new PartialEepGet(_context, proxyHost, proxyPort, _baos, _currentURI.toString(), TrustedUpdate.HEADER_BYTES);
|
|
_get.addStatusListener(this);
|
|
_get.fetch(CONNECT_TIMEOUT);
|
|
} catch (Throwable t) {
|
|
_log.error("Error checking update for plugin", t);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {
|
|
}
|
|
|
|
@Override
|
|
public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining,
|
|
String url, String outputFile, boolean notModified) {
|
|
super.transferComplete(alreadyTransferred, bytesTransferred, bytesRemaining,
|
|
url, outputFile, notModified);
|
|
// super sets _newVersion if newer
|
|
boolean newer = _newVersion != null;
|
|
if (newer) {
|
|
_mgr.notifyVersionAvailable(this, _currentURI, UpdateType.PLUGIN, _appName, UpdateMethod.HTTP,
|
|
_urls, _newVersion, _oldVersion);
|
|
}
|
|
_mgr.notifyCheckComplete(this, newer, true);
|
|
}
|
|
|
|
@Override
|
|
public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {
|
|
File f = new File(_updateFile);
|
|
f.delete();
|
|
_mgr.notifyCheckComplete(this, false, false);
|
|
}
|
|
}
|
|
|