All Downloads are FREE. Search and download functionalities are using the official Maven repository.

aQute.bnd.signing.JartoolSigner Maven / Gradle / Ivy

Go to download

The bndlib project is a general library to be used with OSGi bundles. It contains lots of cool functionality that calculates dependencies, etc.

There is a newer version: 2.4.0
Show newest version
package aQute.bnd.signing;

import java.io.*;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.*;

import aQute.bnd.osgi.*;
import aQute.bnd.service.*;
import aQute.libg.command.*;
import aQute.service.reporter.*;

/**
 * Sign the jar file. -sign :  [ ';' 'password:='  ] [ ';'
 * 'keystore:='  ] [ ';' 'sign-password:='  ] ( ',' ... )*
 * 
 * @author aqute
 */
public class JartoolSigner implements Plugin, SignerPlugin {
	String	keystore;
	String	storetype;
	String	path	= "jarsigner";
	String	storepass;
	String	keypass;
	String	sigFile;
	String	digestalg;

	public void setProperties(Map map) {
		if (map.containsKey("keystore"))
			this.keystore = map.get("keystore");
		if (map.containsKey("storetype"))
			this.storetype = map.get("storetype");
		if (map.containsKey("storepass"))
			this.storepass = map.get("storepass");
		if (map.containsKey("keypass"))
			this.keypass = map.get("keypass");
		if (map.containsKey("path"))
			this.path = map.get("path");
		if (map.containsKey("sigFile"))
			this.sigFile = map.get("sigFile");
		if (map.containsKey("digestalg"))
			this.digestalg = map.get("digestalg");
	}

	public void setReporter(Reporter processor) {}

	public void sign(Builder builder, String alias) throws Exception {
		File f = builder.getFile(keystore);
		if (!f.isFile()) {
			builder.error("Invalid keystore %s", f.getAbsolutePath());
			return;
		}

		Jar jar = builder.getJar();
		File tmp = File.createTempFile("signdjar", ".jar");
		tmp.deleteOnExit();

		jar.write(tmp);

		Command command = new Command();
		command.add(path);
		if (keystore != null) {
			command.add("-keystore");
			command.add(f.getAbsolutePath());
		}

		if (storetype != null) {
			command.add("-storetype");
			command.add(storetype);
		}

		if (keypass != null) {
			command.add("-keypass");
			command.add(keypass);
		}

		if (storepass != null) {
			command.add("-storepass");
			command.add(storepass);
		}

		if (sigFile != null) {
			command.add("-sigFile");
			command.add(sigFile);
		}

		if (digestalg != null) {
			command.add("-digestalg");
			command.add(digestalg);
		}

		command.add(tmp.getAbsolutePath());
		command.add(alias);
		builder.trace("Jarsigner command: %s", command);
		command.setTimeout(20, TimeUnit.SECONDS);
		StringBuilder out = new StringBuilder();
		StringBuilder err = new StringBuilder();
		int exitValue = command.execute(out, err);
		if (exitValue != 0) {
			builder.error("Signing Jar out: %s\nerr: %s", out, err);
		} else {
			builder.trace("Signing Jar out: %s \nerr: %s", out, err);
		}

		Jar signed = new Jar(tmp);
		builder.addClose(signed);

		Map dir = signed.getDirectories().get("META-INF");
		for (Entry entry : dir.entrySet()) {
			String path = entry.getKey();
			if (path.matches(".*\\.(DSA|RSA|SF|MF)$")) {
				jar.putResource(path, entry.getValue());
			}
		}
		jar.setDoNotTouchManifest();
	}

	StringBuilder collect(final InputStream in) throws Exception {
		final StringBuilder sb = new StringBuilder();

		Thread tin = new Thread() {
			@Override
			public void run() {
				try {
					BufferedReader rdr = new BufferedReader(new InputStreamReader(in, Constants.DEFAULT_CHARSET));
					String line = rdr.readLine();
					while (line != null) {
						sb.append(line);
						line = rdr.readLine();
					}
					rdr.close();
					in.close();
				}
				catch (Exception e) {
					// Ignore any exceptions
				}
			}
		};
		tin.start();
		return sb;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy