/* DigiDoc4J library
*
* This software is released under either the GNU Library General Public
* License (see LICENSE.LGPL).
*
* Note that the only valid version of the LGPL license as far as this
* project is concerned is the original GNU Library General Public License
* Version 2.1, February 1999
*/
package org.digidoc4j.impl.bdoc;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.util.List;
import org.apache.xml.security.signature.Reference;
import org.digidoc4j.Configuration;
import org.digidoc4j.Container;
import org.digidoc4j.ContainerBuilder;
import org.digidoc4j.Signature;
import org.digidoc4j.ValidationResult;
import org.digidoc4j.impl.DigiDoc4JTestHelper;
import org.digidoc4j.testutils.TestDataBuilder;
import org.junit.Ignore;
import org.junit.Test;
public class UriEncodingTest extends DigiDoc4JTestHelper {
@Test
public void signatureReferencesUseUriEncodingButManifestUsesPlainUtf8() throws InterruptedException {
String fileName = "dds_JÜRIÖÖ € žŠ päev.txt";
String expectedEncoding = "dds_J%C3%9CRI%C3%96%C3%96%20%E2%82%AC%20%C5%BE%C5%A0%20p%C3%A4ev.txt";
signAndAssertEncoding(fileName, expectedEncoding);
// TODO: Also write an assertion to verify that the manifest file does NOT use URI encoding
}
@Test
public void encodeDataFileWithSpecialCharacters() throws Exception {
String fileName = "et10i_0123456789!\\#$%&'()+,-. ;=@[]_`}~ et_EE";
String expectedEncoding = "et10i_0123456789!%5C%23%24%25%26'()%2B%2C-.%20%3B%3D%40%5B%5D_%60%7D~%20et_EE";
signAndAssertEncoding(fileName, expectedEncoding);
}
@Test
public void validatePartialEncoding_shouldBeValid() throws Exception {
Container container = ContainerBuilder.
aContainer().
fromExistingFile("testFiles/valid-containers/et10_0123456789!#$%&'()+,-. ;=@[]_`}- et_EE_utf8.zip-d_ec.bdoc").
build();
ValidationResult result = container.validate();
assertTrue(result.isValid());
}
@Test
@Ignore("https://www.pivotaltracker.com/story/show/125469911")
public void validateContainer_withWhitespaceEncodedAsPlus_shouldBeValid() throws Exception {
Container container = ContainerBuilder.
aContainer().
fromExistingFile("testFiles/valid-containers/M1n1 Testäöüõ!.txt-TS-d4j.bdoc").
build();
ValidationResult result = container.validate();
assertTrue(result.isValid());
}
private void signAndAssertEncoding(String fileName, String expectedEncoding) {
Signature signature = sign(fileName);
assertTrue(signature.validateSignature().isValid());
List<Reference> referencesInSignature = ((BDocSignature)signature).getOrigin().getReferences();
assertEquals(expectedEncoding, referencesInSignature.get(0).getURI());
}
protected Signature sign(String fileName) {
Container container = ContainerBuilder.
aContainer().
withConfiguration(new Configuration(Configuration.Mode.TEST)).
withDataFile(new ByteArrayInputStream("file contents".getBytes()), fileName, "application/octet-stream").
build();
Signature signature = TestDataBuilder.signContainer(container);
return signature;
}
}