package com.airlock.iam.system.manifest;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
import java.util.Optional;
import java.util.jar.Manifest;

public final class ManifestReader {
   @SuppressFBWarnings(value = "URLCONNECTION_SSRF_FD", justification = "URL is not constructed from user-provided input")
   public static Optional<Manifest> readManifest() {
      URL classUrl = getClassUrl();
      if (!"jar".equals(classUrl.getProtocol())) {
         return Optional.empty();
      }

      try (InputStream input = URI.create(getManifestPath(classUrl)).toURL().openStream()) {
         Manifest manifest = new Manifest(input);
         return Optional.of(manifest);
      } catch (IOException e) {
         return Optional.empty();
      }
   }

   private static URL getClassUrl() {
      Class<ManifestReader> clazz = ManifestReader.class;
      String simpleName = clazz.getSimpleName() + ".class";
      return clazz.getResource(simpleName);
   }

   private static String getManifestPath(URL classUrl) {
      String path = classUrl.toString();
      return path.substring(0, path.lastIndexOf(33) + 1) + "/META-INF/MANIFEST.MF";
   }

   private ManifestReader() {
      throw new AssertionError();
   }
}
