package jenkins;

import static org.junit.Assert.fail;

import hudson.remoting.Channel;
import hudson.remoting.Which;
import org.apache.commons.io.output.NullOutputStream;
import org.junit.Test;

import java.io.File;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.apache.commons.io.IOUtils;

/**
 * @author Kohsuke Kawaguchi
 */
public class RemotingJarSignatureTest {
    /**
     * Makes sure that the remoting jar is properly signed.
     */
    @Test
    public void testSignature() throws Exception {
        File jar = Which.jarFile(Channel.class);
//        File jar = new File("/home/kohsuke/.m2/repository/org/jenkins-ci/main/remoting/1.421/remoting-1.421.jar");
//        File jar = new File("/home/kohsuke/.m2/repository/org/jenkins-ci/main/remoting/2.0/remoting-2.0.jar");
        System.out.println("Verifying "+jar);

        JarFile myJar = new JarFile(jar,true);

        Enumeration<JarEntry> entries = myJar.entries();
        while (entries.hasMoreElements()) {
            JarEntry entry = entries.nextElement();
            if (entry.isDirectory())    continue;

            // unsigned files that are related to signatures
            String name = entry.getName();
            if (name.equals("META-INF/MANIFEST.MF")) continue;
            if (name.startsWith("META-INF/") && name.endsWith(".SF")) continue;
            if (name.startsWith("META-INF/") && name.endsWith(".RSA")) continue;
            if (name.startsWith("META-INF/") && name.endsWith(".DSA")) continue;

            // make sure bits are signed
            IOUtils.copy(myJar.getInputStream(entry), NullOutputStream.NULL_OUTPUT_STREAM);
            if (entry.getCodeSigners()==null) {
                fail("No signature for " + name);
            }
        }
    }
}
