ArchiveEntry.java

  1. /*
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  * http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing,
  13.  * software distributed under the License is distributed on an
  14.  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15.  * KIND, either express or implied.  See the License for the
  16.  * specific language governing permissions and limitations
  17.  * under the License.
  18.  */
  19. package org.apache.commons.compress.archivers;

  20. import java.io.IOException;
  21. import java.nio.file.Path;
  22. import java.util.Date;

  23. /**
  24.  * An entry of an archive.
  25.  */
  26. public interface ArchiveEntry {

  27.     /**
  28.      * Special value ({@value}) indicating that the size is unknown.
  29.      */
  30.     long SIZE_UNKNOWN = -1;

  31.     /**
  32.      * Gets the last modified date of this entry.
  33.      *
  34.      * @return the last modified date of this entry.
  35.      * @since 1.1
  36.      */
  37.     Date getLastModifiedDate();

  38.     /**
  39.      * Gets the name of the entry in this archive. May refer to a file or directory or other item.
  40.      * <p>
  41.      * This method returns the raw name as it is stored inside of the archive.
  42.      * </p>
  43.      *
  44.      * @return The name of this entry in the archive.
  45.      */
  46.     String getName();

  47.     /**
  48.      * Gets the uncompressed size of this entry. May be -1 (SIZE_UNKNOWN) if the size is unknown
  49.      *
  50.      * @return the uncompressed size of this entry.
  51.      */
  52.     long getSize();

  53.     /**
  54.      * Tests whether this entry refers to a directory (true).
  55.      *
  56.      * @return true if this entry refers to a directory.
  57.      */
  58.     boolean isDirectory();

  59.     /**
  60.      * Resolves this entry in the given parent Path.
  61.      *
  62.      * @param parentPath the {@link Path#resolve(Path)} receiver.
  63.      * @return a resolved and normalized Path.
  64.      * @throws IOException if this method detects a Zip slip.
  65.      * @since 1.26.0
  66.      */
  67.     default Path resolveIn(final Path parentPath) throws IOException {
  68.         final String name = getName();
  69.         final Path outputFile = parentPath.resolve(name).normalize();
  70.         if (!outputFile.startsWith(parentPath)) {
  71.             throw new IOException(String.format("Zip slip '%s' + '%s' -> '%s'", parentPath, name, outputFile));
  72.         }
  73.         return outputFile;
  74.     }

  75. }