/* 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.utils;
import org.apache.commons.io.IOUtils;
import org.digidoc4j.Container;
import org.digidoc4j.SignatureProfile;
import org.digidoc4j.Version;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import static eu.europa.esig.dss.SignatureLevel.ASiC_E_BASELINE_B;
import static eu.europa.esig.dss.SignatureLevel.ASiC_E_BASELINE_LT;
import static eu.europa.esig.dss.SignatureLevel.ASiC_E_BASELINE_LTA;
import static eu.europa.esig.dss.SignatureLevel.ASiC_S_BASELINE_B;
import static java.nio.file.Files.deleteIfExists;
import eu.europa.esig.dss.MimeType;
import eu.europa.esig.dss.SignatureLevel;
public final class Helper {
private static final Logger logger = LoggerFactory.getLogger(Helper.class);
private static final int ZIP_VERIFICATION_CODE = 0x504b0304;
private static final int INT_LENGTH = 4;
private static final String BDOC_TM_SIGNATURE_LEVEL = "ASiC_E_BASELINE_LT_TM";
private static final String EMPTY_CONTAINER_SIGNATURE_LEVEL = "ASiC_E";
private Helper() {
}
/**
* @param stream aa
* @return aa
* @throws IOException aa
*/
public static boolean isZipFile(InputStream stream) throws IOException {
DataInputStream in = new DataInputStream(stream);
if (stream.markSupported())
stream.mark(INT_LENGTH);
int test = in.readInt();
if (stream.markSupported())
stream.reset();
final int zipVerificationCode = ZIP_VERIFICATION_CODE;
return test == zipVerificationCode;
}
/**
* @param file aa
* @return aa
* @throws IOException aa
*/
public static boolean isZipFile(File file) throws IOException {
try (FileInputStream stream = new FileInputStream(file)) {
return isZipFile(stream);
}
}
/**
* @param file aa
* @return aa
* @throws ParserConfigurationException aa
*/
public static boolean isXMLFile(File file) throws ParserConfigurationException {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
try {
builder.parse(file);
} catch (Exception e) {
return false;
}
return true;
}
/**
* @param file file to be deleted
* @throws IOException if an IO Exception occurs
*/
public static void deleteFile(String file) throws IOException {
deleteIfExists(Paths.get(file));
}
/**
* Get the signature from a file.
*
* @param file file containing the container
* @param index index of the signature file
* @return signature
* @throws IOException when the signature is not found
*/
public static String extractSignature(String file, int index) throws IOException {
ZipFile zipFile = new ZipFile(file);
String signatureFileName = "META-INF/signatures" + index + ".xml";
ZipEntry entry = zipFile.getEntry(signatureFileName);
if (entry == null)
throw new IOException(signatureFileName + " does not exists in archive: " + file);
InputStream inputStream = zipFile.getInputStream(entry);
String signatureContent = IOUtils.toString(inputStream, "UTF-8");
zipFile.close();
inputStream.close();
return signatureContent;
}
/**
* Serialize object.
*
* @param object object to be serialized
* @param filename name of file to store serialized object in
*/
public static <T> void serialize(T object, String filename) {
FileOutputStream fileOut = null;
ObjectOutputStream out = null;
try {
fileOut = new FileOutputStream(filename);
out = new ObjectOutputStream(fileOut);
out.writeObject(object);
out.flush();
} catch (Exception e) {
throw new DigiDoc4JException(e);
} finally {
IOUtils.closeQuietly(out);
IOUtils.closeQuietly(fileOut);
}
}
/**
* Deserialize a previously serialized container
*
* @param filename name of the file containing the serialized container
* @return container
*/
public static <T> T deserializer(String filename) {
FileInputStream fileIn = null;
ObjectInputStream in = null;
try {
fileIn = new FileInputStream(filename);
in = new ObjectInputStream(fileIn);
T object = (T) in.readObject();
return object;
} catch (Exception e) {
throw new DigiDoc4JException(e);
} finally {
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(fileIn);
}
}
/** creates user agent value for given container
* format is:
* LIB DigiDoc4J/VERSION format: CONTAINER_TYPE signatureProfile: SIGNATURE_PROFILE
* Java: JAVA_VERSION/JAVA_PROVIDER OS: OPERATING_SYSTEM JVM: JVM
*
* @param container container used for creation user agent
* @return user agent string
*/
public static String createUserAgent(Container container) {
String documentType = container.getDocumentType().toString();
String version = container.getVersion();
String signatureProfile = container.getSignatureProfile();
return createUserAgent(documentType, version, signatureProfile);
}
public static String createUserAgent(String documentType, String version, String signatureProfile) {
StringBuilder ua = new StringBuilder("LIB DigiDoc4j/").append(Version.VERSION == null ? "DEV" : Version.VERSION);
ua.append(" format: ").append(documentType);
if (version != null) {
ua.append("/").append(version);
}
if(signatureProfile != null) {
ua.append(" signatureProfile: ").append(signatureProfile);
}
ua.append(" Java: ").append(System.getProperty("java.version"));
ua.append("/").append(System.getProperty("java.vendor"));
ua.append(" OS: ").append(System.getProperty("os.name"));
ua.append("/").append(System.getProperty("os.arch"));
ua.append("/").append(System.getProperty("os.version"));
ua.append(" JVM: ").append(System.getProperty("java.vm.name"));
ua.append("/").append(System.getProperty("java.vm.vendor"));
ua.append("/").append(System.getProperty("java.vm.version"));
String userAgent = ua.toString();
logger.debug("User-Agent: " + userAgent);
return userAgent;
}
public static String createBDocUserAgent() {
return createUserAgent(MimeType.ASICE.getMimeTypeString(), null, EMPTY_CONTAINER_SIGNATURE_LEVEL);
}
public static String createBDocUserAgent(SignatureProfile signatureProfile) {
if(signatureProfile == SignatureProfile.LT_TM) {
return createUserAgent(MimeType.ASICE.getMimeTypeString(), null, BDOC_TM_SIGNATURE_LEVEL);
}
SignatureLevel signatureLevel = determineSignatureLevel(signatureProfile);
return createBDocUserAgent(signatureLevel);
}
private static String createBDocUserAgent(SignatureLevel signatureLevel) {
return createUserAgent(MimeType.ASICE.getMimeTypeString(), null, signatureLevel.name());
}
private static SignatureLevel determineSignatureLevel(SignatureProfile signatureProfile) {
if(signatureProfile == SignatureProfile.B_BES) {
return ASiC_E_BASELINE_B;
} else if(signatureProfile == SignatureProfile.LTA) {
return ASiC_E_BASELINE_LTA;
} else {
return ASiC_E_BASELINE_LT;
}
}
}