From 7651d02856325bec057619d215ee30c4c605ee80 Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Tue, 2 Nov 2004 23:37:21 +0000 Subject: [PATCH] 1. Updated repository work; now has the following from Russel Gold's contrib -uses to get -sets a classpath after 2. some changes to Get to make this work. They also lay the way to adding progress indicators to guis, if that is felt useful in IDEs (it may be, once downloads become more common) 3. starting on security. This will need to work with to get done. Currently the md5 can be fetched if asked for, and if so it must exist. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276989 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 1 - .../taskdefs/optional/getlibraries.xml | 7 + .../org/apache/tools/ant/taskdefs/Get.java | 386 +++++++++++------- .../optional/repository/GetLibraries.java | 23 +- .../optional/repository/HttpRepository.java | 189 ++------- .../optional/repository/MavenRepository.java | 79 ++++ .../optional/repository/Repository.java | 2 +- .../optional/repository/RepositoryRef.java | 5 +- .../optional/repository/GetLibrariesTest.java | 6 +- 9 files changed, 393 insertions(+), 305 deletions(-) diff --git a/build.xml b/build.xml index 6def20a0c..97a3c2229 100644 --- a/build.xml +++ b/build.xml @@ -329,7 +329,6 @@ - diff --git a/src/etc/testcases/taskdefs/optional/getlibraries.xml b/src/etc/testcases/taskdefs/optional/getlibraries.xml index ee1ec768f..105db852f 100644 --- a/src/etc/testcases/taskdefs/optional/getlibraries.xml +++ b/src/etc/testcases/taskdefs/optional/getlibraries.xml @@ -157,5 +157,12 @@ Did not find commons logging in the path + + + + + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/Get.java b/src/main/org/apache/tools/ant/taskdefs/Get.java index 5b2223c16..1ac4dc4f6 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Get.java +++ b/src/main/org/apache/tools/ant/taskdefs/Get.java @@ -21,6 +21,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.PrintStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; @@ -51,12 +52,47 @@ public class Get extends Task { private String pword = null; + /** * Does the work. * * @exception BuildException Thrown in unrecoverable error. */ public void execute() throws BuildException { + + //set up logging + int logLevel = Project.MSG_INFO; + DownloadProgress progress=null; + if (verbose) { + progress = new VerboseProgress(System.out); + } + + //execute the get + try { + doGet(logLevel, progress); + } catch (IOException ioe) { + log("Error getting " + source + " to " + dest); + if (!ignoreErrors) { + throw new BuildException(ioe, getLocation()); + } + } + } + + /** + * make a get request, with the supplied progress and logging info. + * All the other config parameters are set at the task level, + * source, dest, ignoreErrors, etc. + * @param logLevel level to log at, see {@link Project#log(String, int)} + * @param progress progress callback; null for no-callbacks + * @return true for a successful download, false otherwise. + * The return value is only relevant when {@link #ignoreErrors} is true, as + * when false all failures raise BuildExceptions. + * @throws IOException for network trouble + * @throws BuildException for argument errors, or other trouble when ignoreErrors + * is false. + */ + public boolean doGet(int logLevel, DownloadProgress progress) + throws IOException { if (source == null) { throw new BuildException("src attribute is required", getLocation()); } @@ -67,172 +103,155 @@ public class Get extends Task { if (dest.exists() && dest.isDirectory()) { throw new BuildException("The specified destination is a directory", - getLocation()); + getLocation()); } if (dest.exists() && !dest.canWrite()) { throw new BuildException("Can't write to " + dest.getAbsolutePath(), - getLocation()); + getLocation()); } + //dont do any progress, unless asked + if(progress==null) { + progress = new NullProgress(); + } + log("Getting: " + source, logLevel); - try { - - log("Getting: " + source); - - //set the timestamp to the file date. - long timestamp = 0; - - boolean hasTimestamp = false; - if (useTimestamp && dest.exists()) { - timestamp = dest.lastModified(); - if (verbose) { - Date t = new Date(timestamp); - log("local file date : " + t.toString()); - } + //set the timestamp to the file date. + long timestamp = 0; - hasTimestamp = true; + boolean hasTimestamp = false; + if (useTimestamp && dest.exists()) { + timestamp = dest.lastModified(); + if (verbose) { + Date t = new Date(timestamp); + log("local file date : " + t.toString(), logLevel); } + hasTimestamp = true; + } - //set up the URL connection - URLConnection connection = source.openConnection(); - //modify the headers - //NB: things like user authentication could go in here too. - if (useTimestamp && hasTimestamp) { - connection.setIfModifiedSince(timestamp); - } - // prepare Java 1.1 style credentials - if (uname != null || pword != null) { - String up = uname + ":" + pword; - String encoding; - // check to see if sun's Base64 encoder is available. - try { - Object encoder = - Class.forName("sun.misc.BASE64Encoder").newInstance(); - encoding = (String) - encoder.getClass().getMethod("encode", new Class[] {byte[].class}) - .invoke(encoder, new Object[] {up.getBytes()}); - - } catch (Exception ex) { // sun's base64 encoder isn't available - Base64Converter encoder = new Base64Converter(); - encoding = encoder.encode(up.getBytes()); - } - connection.setRequestProperty ("Authorization", - "Basic " + encoding); - } + //set up the URL connection + URLConnection connection = source.openConnection(); + //modify the headers + //NB: things like user authentication could go in here too. + if (useTimestamp && hasTimestamp) { + connection.setIfModifiedSince(timestamp); + } + // prepare Java 1.1 style credentials + if (uname != null || pword != null) { + String up = uname + ":" + pword; + String encoding; + //we do not use the sun impl for portability, + //and always use our own implementation for consistent + //testing + Base64Converter encoder = new Base64Converter(); + encoding = encoder.encode(up.getBytes()); + connection.setRequestProperty ("Authorization", + "Basic " + encoding); + } - //connect to the remote site (may take some time) - connection.connect(); - //next test for a 304 result (HTTP only) - if (connection instanceof HttpURLConnection) { - HttpURLConnection httpConnection + //connect to the remote site (may take some time) + connection.connect(); + //next test for a 304 result (HTTP only) + if (connection instanceof HttpURLConnection) { + HttpURLConnection httpConnection = (HttpURLConnection) connection; - if (httpConnection.getResponseCode() + if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) { - //not modified so no file download. just return - //instead and trace out something so the user - //doesn't think that the download happened when it - //didn't - log("Not modified - so not downloaded"); - return; - } - // test for 401 result (HTTP only) - if (httpConnection.getResponseCode() - == HttpURLConnection.HTTP_UNAUTHORIZED) { - String message = "HTTP Authorization failure"; - if (ignoreErrors) { - log(message, Project.MSG_WARN); - return; - } else { - throw new BuildException(message); - } - } - - } - - //REVISIT: at this point even non HTTP connections may - //support the if-modified-since behaviour -we just check - //the date of the content and skip the write if it is not - //newer. Some protocols (FTP) don't include dates, of - //course. - - InputStream is = null; - for (int i = 0; i < 3; i++) { - try { - is = connection.getInputStream(); - break; - } catch (IOException ex) { - log("Error opening connection " + ex); - } + //not modified so no file download. just return + //instead and trace out something so the user + //doesn't think that the download happened when it + //didn't + log("Not modified - so not downloaded", logLevel); + return false; } - if (is == null) { - log("Can't get " + source + " to " + dest); + // test for 401 result (HTTP only) + if (httpConnection.getResponseCode() + == HttpURLConnection.HTTP_UNAUTHORIZED) { + String message = "HTTP Authorization failure"; if (ignoreErrors) { - return; + log(message, logLevel); + return false; + } else { + throw new BuildException(message); } - throw new BuildException("Can't get " + source + " to " + dest, - getLocation()); } - FileOutputStream fos = new FileOutputStream(dest); - boolean finished = false; + } + + //REVISIT: at this point even non HTTP connections may + //support the if-modified-since behaviour -we just check + //the date of the content and skip the write if it is not + //newer. Some protocols (FTP) don't include dates, of + //course. + + InputStream is = null; + for (int i = 0; i < 3; i++) { + //this three attempt trick is to get round quirks in different + //Java implementations. Some of them take a few goes to bind + //property; we ignore the first couple of such failures. try { - byte[] buffer = new byte[100 * 1024]; - int length; - int dots = 0; - - while ((length = is.read(buffer)) >= 0) { - fos.write(buffer, 0, length); - if (verbose) { - System.out.print("."); - if (dots++ > 50) { - System.out.flush(); - dots = 0; - } - } - } - if (verbose) { - System.out.println(); - } - finished = true; - } finally { - if (fos != null) { - fos.close(); - } - is.close(); - // we have started to (over)write dest, but failed. - // Try to delete the garbage we'd otherwise leave - // behind. - if (!finished) { - dest.delete(); - } + is = connection.getInputStream(); + break; + } catch (IOException ex) { + log("Error opening connection " + ex,logLevel); + } + } + if (is == null) { + log("Can't get " + source + " to " + dest,logLevel); + if (ignoreErrors) { + return false; } + throw new BuildException("Can't get " + source + " to " + dest, + getLocation()); + } - //if (and only if) the use file time option is set, then - //the saved file now has its timestamp set to that of the - //downloaded file - if (useTimestamp) { - long remoteTimestamp = connection.getLastModified(); - if (verbose) { - Date t = new Date(remoteTimestamp); - log("last modified = " + t.toString() + FileOutputStream fos = new FileOutputStream(dest); + progress.beginDownload(); + boolean finished = false; + try { + byte[] buffer = new byte[100 * 1024]; + int length; + while ((length = is.read(buffer)) >= 0) { + fos.write(buffer, 0, length); + progress.onTick(); + } + finished = true; + } finally { + FileUtils.close(fos); + FileUtils.close(is); + + // we have started to (over)write dest, but failed. + // Try to delete the garbage we'd otherwise leave + // behind. + if (!finished) { + dest.delete(); + } + } + progress.endDownload(); + + //if (and only if) the use file time option is set, then + //the saved file now has its timestamp set to that of the + //downloaded file + if (useTimestamp) { + long remoteTimestamp = connection.getLastModified(); + if (verbose) { + Date t = new Date(remoteTimestamp); + log("last modified = " + t.toString() + ((remoteTimestamp == 0) - ? " - using current time instead" - : "")); - } - if (remoteTimestamp != 0) { - FileUtils.newFileUtils() - .setFileLastModified(dest, remoteTimestamp); - } + ? " - using current time instead" + : ""),logLevel); } - } catch (IOException ioe) { - log("Error getting " + source + " to " + dest); - if (ignoreErrors) { - return; + if (remoteTimestamp != 0) { + FileUtils.newFileUtils() + .setFileLastModified(dest, remoteTimestamp); } - throw new BuildException(ioe, getLocation()); } + + //successful download + return true; } + /** * Set the URL to get. * @@ -317,7 +336,7 @@ public class Get extends Task { * *********************************************************************/ - private static class Base64Converter { + protected static class Base64Converter { public final char [ ] alphabet = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 0 to 7 @@ -388,4 +407,89 @@ public class Get extends Task { return new String(out); } } + + public interface DownloadProgress { + /** + * begin a download + */ + public void beginDownload(); + + /** + * tick handler + * + */ + public void onTick(); + + /** + * end a download + */ + public void endDownload(); + } + + /** + * do nothing with progress info + */ + public static class NullProgress implements DownloadProgress { + + /** + * begin a download + */ + public void beginDownload() { + + } + + /** + * tick handler + * + */ + public void onTick() { + } + + /** + * end a download + */ + public void endDownload() { + + } + } + + /** + * verbose progress system prints to some output stream + */ + public static class VerboseProgress implements DownloadProgress { + private int dots = 0; + PrintStream out; + + public VerboseProgress(PrintStream out) { + this.out = out; + } + + /** + * begin a download + */ + public void beginDownload() { + dots=0; + } + + /** + * tick handler + * + */ + public void onTick() { + out.print("."); + if (dots++ > 50) { + out.flush(); + dots = 0; + } + } + + /** + * end a download + */ + public void endDownload() { + out.println(); + out.flush(); + } + } + } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/repository/GetLibraries.java b/src/main/org/apache/tools/ant/taskdefs/optional/repository/GetLibraries.java index 108593318..031b351cf 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/repository/GetLibraries.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/repository/GetLibraries.java @@ -105,16 +105,6 @@ public class GetLibraries extends Task { add(repo); } - - /** - * add a maven repository. - */ -/* - public void addMavenRepository(MavenRepository repo) { - add(repo); - } -*/ - /** * bind to a repository. */ @@ -173,12 +163,17 @@ public class GetLibraries extends Task { this.offline = offline; } + + /** + * get the destination directory + * @return + */ public File getDestDir() { return destDir; } /** - * get fore download flag + * get force download flag * @return */ public boolean isForceDownload() { @@ -224,7 +219,7 @@ public class GetLibraries extends Task { * @throws BuildException */ public void validate() { - if (destDir == null || !destDir.exists() || !destDir.isDirectory()) { + if (destDir == null || !destDir.isDirectory()) { throw new BuildException(ERROR_NO_DEST_DIR); } if (repository == null) { @@ -245,6 +240,7 @@ public class GetLibraries extends Task { */ public void execute() throws BuildException { validate(); + destDir.mkdirs(); Repository repo = repository.resolve(); repo.validate(); if (libraries.size() == 0) { @@ -262,7 +258,6 @@ public class GetLibraries extends Task { return; } - //connect the repository repo.connect(this); try { @@ -413,7 +408,6 @@ public class GetLibraries extends Task { return (_next != null); } - /** * get the next element * @return @@ -427,7 +421,6 @@ public class GetLibraries extends Task { return result; } - /** * removal is not supported * @throws UnsupportedOperationException always diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/repository/HttpRepository.java b/src/main/org/apache/tools/ant/taskdefs/optional/repository/HttpRepository.java index 04243c0e3..ac28c00e5 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/repository/HttpRepository.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/repository/HttpRepository.java @@ -16,25 +16,15 @@ */ package org.apache.tools.ant.taskdefs.optional.repository; -import org.apache.commons.httpclient.Credentials; -import org.apache.commons.httpclient.DefaultMethodRetryHandler; -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.HttpStatus; -import org.apache.commons.httpclient.UsernamePasswordCredentials; -import org.apache.commons.httpclient.cookie.CookiePolicy; -import org.apache.commons.httpclient.methods.GetMethod; + import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; -import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.taskdefs.Get; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; -import java.util.Date; /** * This is a base class for repositories that are built on URLs. Although you @@ -59,21 +49,10 @@ public abstract class HttpRepository extends Repository { */ private String password; - /** * auth realm; can be null */ - private String realm; - - /** - * this is our http client - */ - private HttpClient client; - - /** - * number of times to retry fetches - */ - private int retries = 1; +// private String realm; /** * no repository URL @@ -88,7 +67,6 @@ public abstract class HttpRepository extends Repository { /** * retry logic */ - private DefaultMethodRetryHandler retryhandler; public static final String ERROR_REENTRANT_USE = "Repository is already in use"; private static final String IF_MODIFIED_SINCE = "If-Modified-Since"; private static final int BLOCKSIZE = 8192; @@ -136,10 +114,12 @@ public abstract class HttpRepository extends Repository { public void setPassword(String password) { this.password = password; } +/* public String getRealm() { return realm; } +*/ /** * set the realm for authentication; empty string is equivalent to "any @@ -147,39 +127,13 @@ public abstract class HttpRepository extends Repository { * * @param realm */ - public void setRealm(String realm) { +/* public void setRealm(String realm) { if (realm != null) { this.realm = realm; } else { this.realm = null; } - } - - - /** - * @return number of times to retry fetches - */ - public int getRetries() { - return retries; - } - - /** - * number of times to retry fetches - * - * @param retries - */ - public void setRetries(int retries) { - this.retries = retries; - } - - /** - * get the client - * - * @return - */ - public HttpClient getClient() { - return client; - } + }*/ public GetLibraries getOwner() { return owner; @@ -211,17 +165,9 @@ public abstract class HttpRepository extends Repository { */ public void connect(GetLibraries newOwner) { this.owner = newOwner; - if (client != null) { - throw new BuildException(ERROR_REENTRANT_USE); - } if (!url.endsWith("/")) { url = url + '/'; } - client = new HttpClient(); - //retry handler - retryhandler = new DefaultMethodRetryHandler(); - retryhandler.setRequestSentRetryEnabled(false); - retryhandler.setRetryCount(retries); //validate the URL URL repository; @@ -230,18 +176,6 @@ public abstract class HttpRepository extends Repository { } catch (MalformedURLException e) { throw new BuildException(e); } - //authentication - if (username != null) { - Credentials defaultcreds = - new UsernamePasswordCredentials(username, password); - client.getState().setCredentials(realm, - repository.getHost(), - defaultcreds); - //turn auth on on first call - client.getState().setAuthenticationPreemptive(true); - } - //cookies - client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY); } /** @@ -253,8 +187,6 @@ public abstract class HttpRepository extends Repository { */ public void disconnect() { - client = null; - retryhandler = null; } /** @@ -265,53 +197,16 @@ public abstract class HttpRepository extends Repository { * If it returns false the repository considers itself offline. Similarly, * any ioexception is interpreted as being offline. *

- * The Http implementation probes for the base URL being reachable, and - * returning a 200 status code. - * + * The Http implementation does nothing * @return true if the repository is online. * * @throws java.io.IOException */ public boolean checkRepositoryReachable() throws IOException { - //return pingBaseURL(); return true; } - private boolean pingBaseURL() throws IOException { - GetMethod get = createGet(getUrl()); - client.executeMethod(get); - return get.getStatusCode() == HttpStatus.SC_OK; - } - - /** - * create a new getMethod against any URI - * - * @param url - * - * @return - */ - public GetMethod createGet(String url) { - GetMethod method = new GetMethod(url); - method.setMethodRetryHandler(retryhandler); - method.setDoAuthentication(true); - method.setFollowRedirects(true); - - return method; - } - - /** - * @param method - * @param timestamp - * - * @link http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#if-modified-since - * @link http://www.w3.org/Protocols/rfc850/rfc850.html#z10 - */ - public void setIfModifiedSinceHeader(HttpMethod method, long timestamp) { - Date date = new Date(timestamp); - //ooh, naughty, deprecated. and like why is it deprecated? - method.setRequestHeader(IF_MODIFIED_SINCE, date.toGMTString()); - } /** * fetch a library from the repository @@ -327,42 +222,40 @@ public abstract class HttpRepository extends Repository { String path = getRemoteLibraryURL(library); logVerbose("Library URL=" + path); + URL remoteURL=new URL(path); logVerbose("destination =" + library.getAbsolutePath()); - GetMethod get = createGet(path); + long start, finish; + start = System.currentTimeMillis(); + finish = System.currentTimeMillis(); boolean useTimestamps = !getOwner().isForceDownload() && !library.exists(); - if (useTimestamps) { - setIfModifiedSinceHeader(get, library.getLastModified()); - } - try { - long start, finish; - start = System.currentTimeMillis(); - client.executeMethod(get); - if (useTimestamps && get.getStatusCode() == HttpStatus.SC_NOT_MODIFIED) { - logDebug("File is not modified"); - //we get here if there is no change in timestamp - //so no fetch - return false; - } - if (get.getStatusCode() != HttpStatus.SC_OK) { - String message = "Request Failed:" - + get.getStatusCode() - + " from " + get.getPath(); - logVerbose(message); - logVerbose(get.getStatusLine().toString()); - logVerbose(get.getStatusText()); - throw new BuildException(message); - } - saveStreamToLibrary(get, library); - finish = System.currentTimeMillis(); - long diff = finish - start; - logVerbose("downloaded in " + diff / 1000 + " seconds"); - } finally { - // Release the connection. - get.releaseConnection(); - } + boolean success=get(remoteURL, library.getLibraryFile(),useTimestamps, + username, password); + long diff = finish - start; + logVerbose("downloaded in " + diff / 1000 + " seconds"); - return true; + return success; + } + + /** + * get the + * @param url + * @param destFile + * @param useTimestamp + * @return + */ + public boolean get(URL url,File destFile,boolean useTimestamp,String user,String passwd) + throws IOException { + Get getTask = new Get(); + getTask.setProject(getProject()); + getTask.setTaskName("dependencies"); + getTask.setDest(destFile); + getTask.setUsername(user); + getTask.setPassword(passwd); + getTask.setUseTimestamp(useTimestamp); + getTask.setSrc(url); + getTask.setIgnoreErrors(true); + return getTask.doGet(Project.MSG_VERBOSE,null); } /** @@ -375,6 +268,10 @@ public abstract class HttpRepository extends Repository { Project.MSG_VERBOSE); } + /** + * log at debug level + * @param message + */ protected void logDebug(String message) { getOwner().log(message, Project.MSG_DEBUG); @@ -398,6 +295,7 @@ public abstract class HttpRepository extends Repository { * * @throws java.io.IOException on any trouble. */ + /* protected void saveStreamToLibrary(GetMethod get, Library library) throws IOException { //we only get here if we are happy @@ -440,6 +338,7 @@ public abstract class HttpRepository extends Repository { "Could not rename temp file to destination file"); } } + */ /** * Returns a string representation of the repository diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/repository/MavenRepository.java b/src/main/org/apache/tools/ant/taskdefs/optional/repository/MavenRepository.java index 2de024538..ea0ff1531 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/repository/MavenRepository.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/repository/MavenRepository.java @@ -17,6 +17,16 @@ package org.apache.tools.ant.taskdefs.optional.repository; +import org.apache.tools.ant.util.FileUtils; + +import java.io.IOException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; + /** * A Maven repository knows about maven repository layout rules It also defaults @@ -30,6 +40,16 @@ public class MavenRepository extends HttpRepository { public static final String MAVEN_URL = "http://www.ibiblio.org/maven/"; + /** + * check the MD5 flag + */ + public boolean checkMD5; + + /** + * this is what we think the MD5 type is + */ + protected static final String MAVEN_MD5_FILE_TYPE = "US-ASCII"; + /** * bind to the main maven repository */ @@ -37,6 +57,14 @@ public class MavenRepository extends HttpRepository { setUrl(MAVEN_URL); } + /** + * set this to check the MD5 signatures. SECURITY IS NOT YET FUNCTIONAL + * @param checkMD5 + */ + public void setCheckMD5(boolean checkMD5) { + this.checkMD5 = checkMD5; + } + /** * Get the path to a remote library. This is the full URL * @@ -62,4 +90,55 @@ public class MavenRepository extends HttpRepository { return "Maven Repository at " + getUrl(); } + /** + * fetch a library from the repository + * + * @param library + * + * @return true if we retrieved + * + * @throws org.apache.tools.ant.BuildException + * + */ + public boolean fetch(Library library) throws IOException { + boolean fetched=super.fetch(library); + if(fetched && checkMD5) { + //we got here if there was a fetch. so we now get the MD5 info from the file, + boolean successful=false; + String md5path = getRemoteLibraryURL(library) + ".md5"; + File md5file = File.createTempFile(library.getArchive(),".md5"); + Reader in = null; + try { + URL md5url=new URL(md5path); + logVerbose("getting md5 file from " + md5path +" to "+md5file.getAbsolutePath()); + get(md5url,md5file, false,getUsername(), getPassword()); + in = new InputStreamReader(new FileInputStream(md5file),MAVEN_MD5_FILE_TYPE); + char md5data[] =new char[32]; + in.read(md5data); + logDebug("md5 data "+md5data); + //TODO: verify this against a generated signature. + + successful=true; + } catch (IOException e) { + logVerbose("IO failure on MD5 fetch "+e.getMessage()); + throw e; + } finally { + FileUtils.close(in); + if(md5file.exists()) { + md5file.delete(); + } + if(!successful) { + //if security checks failed for any reason, + //delete the library file + //brute force paranoia + library.getLibraryFile().delete(); + } + } + } + return fetched; + + } + } + +// e1b1720a761ca36eaa47e1c7d802e676 \ No newline at end of file diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/repository/Repository.java b/src/main/org/apache/tools/ant/taskdefs/optional/repository/Repository.java index 2c9f4640b..edcf550f0 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/repository/Repository.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/repository/Repository.java @@ -53,7 +53,7 @@ public abstract class Repository extends DataType { if (getRefid() == null) { return this; } else { - Repository repository = (Repository) getCheckedRef(this.getClass(), + Repository repository = (Repository) getCheckedRef(Repository.class, "Repository"); return repository; } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/repository/RepositoryRef.java b/src/main/org/apache/tools/ant/taskdefs/optional/repository/RepositoryRef.java index d53c45576..b1c4ef404 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/repository/RepositoryRef.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/repository/RepositoryRef.java @@ -29,6 +29,9 @@ import java.io.IOException; * @since Ant1.7 */ public final class RepositoryRef extends Repository { + /** this constant name is only funny to COM developers + */ + public static final String E_NOTIMPL = "Not Implemented"; /** @@ -70,7 +73,7 @@ public final class RepositoryRef extends Repository { * @return */ public boolean fetch(Library library) throws IOException { - throw new BuildException("Not Implemented"); + throw new BuildException(E_NOTIMPL); } } diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/repository/GetLibrariesTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/repository/GetLibrariesTest.java index 2b5f718a8..f6e4704f3 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/optional/repository/GetLibrariesTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/repository/GetLibrariesTest.java @@ -66,7 +66,7 @@ public class GetLibrariesTest extends BuildFileTest { /** * refs are broken * */ - public void NotestFunctionalInline() { + public void testFunctionalInline() { execIfOnline("testFunctionalInline"); } @@ -115,4 +115,8 @@ public class GetLibrariesTest extends BuildFileTest { execIfOnline("testPathID"); } + public void testSecurity() { + execIfOnline("testSecurity"); + } + }