Skip to content

Commit abe2ca8

Browse files
committed
refs #29 - Fetching of non-payload files should not be attempted - now throws an error if you try to fetch a non-payload file
1 parent 689db08 commit abe2ca8

7 files changed

Lines changed: 68 additions & 0 deletions

File tree

src/main/java/gov/loc/repository/bagit/transfer/BagFetcher.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,9 @@ private void fetchFile(FetchTxt.FilenameSizeUrl filenameSizeUrl) throws BagTrans
718718
URI uri = parseUri(filenameSizeUrl.getUrl());
719719
Long size = filenameSizeUrl.getSize();
720720
String destinationPath = filenameSizeUrl.getFilename();
721+
if(!destinationPath.startsWith("data")){
722+
throw new BagTransferException("Destination of fetch file is [" + destinationPath + "] which is not a payload file.");
723+
}
721724

722725
// Create the destination for the file.
723726
log.trace(format("Creating destination: {0}", destinationPath));

src/test/java/gov/loc/repository/bagit/transfer/BagFetcherTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import gov.loc.repository.bagit.Bag;
66
import gov.loc.repository.bagit.BagFactory;
77
import gov.loc.repository.bagit.BagFile;
8+
import gov.loc.repository.bagit.transfer.dest.FileSystemFileDestination;
9+
import gov.loc.repository.bagit.transfer.fetch.HttpFetchProtocol;
810
import gov.loc.repository.bagit.utilities.ResourceHelper;
911
import gov.loc.repository.bagit.utilities.SimpleResult;
1012

@@ -18,6 +20,7 @@
1820
import org.jmock.States;
1921
import org.jmock.integration.junit4.JMock;
2022
import org.junit.After;
23+
import org.junit.Assert;
2124
import org.junit.Before;
2225
import org.junit.Test;
2326
import org.junit.runner.RunWith;
@@ -312,6 +315,59 @@ public void testMissingFetchTxt() throws Exception{
312315
this.unit.fetch(bag, mockDestinationFactory, false);
313316

314317
}
318+
319+
/**
320+
* Fetching a payload file. This is correct according to the specs and works in the library.
321+
*
322+
* @link https://tools.ietf.org/html/draft-kunze-bagit#section-2.2.3
323+
* @throws Exception
324+
*/
325+
@Test
326+
public void fetchToPayloadOk() throws Exception {
327+
File templateBag = new File("src/test/resources/bad-fetch-bag");
328+
File bagFile = new File("target/fetchToPayloadOk");
329+
FileUtils.deleteDirectory(bagFile);
330+
FileUtils.copyDirectory(templateBag, bagFile);
331+
BagFetcher fetcher = new BagFetcher(bagFactory);
332+
fetcher.registerProtocol("https", new HttpFetchProtocol());
333+
Bag bag = bagFactory.createBag(bagFile, BagFactory.Version.V0_97, null);
334+
FileSystemFileDestination dest = new FileSystemFileDestination(bagFile);
335+
SimpleResult result = fetcher.fetch(bag, dest, false, true);
336+
Assert.assertTrue(result.isSuccess());
337+
}
338+
339+
/**
340+
* Fetching a non-payload file. This is not allowed according to the specs, at least the specs
341+
* only mention payload files.
342+
*
343+
* @throws Exception
344+
*/
345+
@Test
346+
public void fetchNonPayloadFileShouldFail() throws Exception {
347+
File templateBag = new File("src/test/resources/bad-fetch-bag");
348+
File bagFile = new File("target/fetchNonPayloadFileShouldFail");
349+
FileUtils.deleteDirectory(bagFile);
350+
FileUtils.copyDirectory(templateBag, bagFile);
351+
352+
// Adding an extra line to the fetch.txt, to attempt to fetch a non-payload file
353+
FileUtils.writeStringToFile(
354+
new File(bagFile, "fetch.txt"),
355+
"https://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Wikipedia-logo-v2-nl.svg/135px-Wikipedia-logo-v2-nl.svg.png - metadata/wikipedia.png",
356+
true);
357+
358+
BagFetcher fetcher = new BagFetcher(bagFactory);
359+
fetcher.registerProtocol("https", new HttpFetchProtocol());
360+
Bag bag = bagFactory.createBag(bagFile, BagFactory.Version.V0_97, null);
361+
FileSystemFileDestination dest = new FileSystemFileDestination(bagFile);
362+
363+
// Depending on
364+
SimpleResult result = fetcher.fetch(bag, dest, false, true); // Returns failure, but fetches metadata/wikipedia.png anyway
365+
//SimpleResult result = fetcher.fetch(bag, dest, true, true); // Returns success, but does not fetch metadata/wikipedia.png anyway
366+
Assert.assertFalse(result.isSuccess());
367+
368+
// However ...
369+
Assert.assertFalse(new File(bagFile, "metadata/wikipedia.png").exists());
370+
}
315371

316372
private void expectDest(Expectations e, FetchedFileDestinationFactory destFactory, String path) throws Exception{
317373
FetchedFileDestination mockDestination = this.context.mock(FetchedFileDestination.class, "FetchedFileDestination:" + path);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Payload-Oxum: 18736.1
2+
Bagging-Date: 2016-01-31
3+
Bag-Size: 37.5 KB
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
BagIt-Version: 0.97
2+
Tag-File-Character-Encoding: UTF-8
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
https://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Wikipedia-logo-v2-nl.svg/135px-Wikipedia-logo-v2-nl.svg.png - data/wikipedia.png
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bae7aa47892753a1355770164d780dec data/wikipedia.png
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
1cfd8dfce64cd9aefb016bfce5b5d14e bag-info.txt
2+
9e5ad981e0d29adc278f6a294b8c2aca bagit.txt

0 commit comments

Comments
 (0)