<?php
/**
 * Copyright (c) 2013, 2019 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 */

  # If we are requesting a file and it is on archive.eclipse.org, redirect and exit. 
  $dir = $_SERVER['DOCUMENT_ROOT'] . urldecode(strtok($_SERVER['REQUEST_URI'], "?"));
  $archive_dir = str_replace("download.eclipse.org", "archive.eclipse.org", $dir);
  if(is_file($archive_dir)) {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: " . (empty($_SERVER['HTTPS']) ? "http" : "https") . "://archive.eclipse.org" . $_SERVER['REQUEST_URI']);
    exit;
  }

  # Send short 404 for non-human browsers
  $browser = $_SERVER['HTTP_USER_AGENT'];
        if(
    strpos($browser, "Jakarta") !== FALSE
    || strpos($browser, "Java/") !== FALSE
    || strpos($browser, "Slurp") !== FALSE
    || stripos($browser, "bot") !== FALSE
    || strpos($browser, "bing") !== FALSE
    || strpos($browser, "p2/") !== FALSE
    || strpos($browser, "Wget") !== FALSE
    || strpos($browser, "Googlebot/") !== FALSE
    || strpos($browser, "apacheHttpClient") !== FALSE
    || strpos($browser, "Apache-HttpClient/") !== FALSE
    || stripos($browser, "spider") !== FALSE
    || strpos($browser, "Apache-Maven/") !== FALSE
    || strpos($browser, "Apache Ivy/") !== FALSE
    || strpos($browser, "HTTP-Tiny/") !== FALSE
    || strpos($browser, "Archiva") !== FALSE
    || strpos($browser, "Artifactory/") !== FALSE
    || strpos($browser, "Gradle/") !== FALSE
    || strpos($browser, "Finjan") !== FALSE
    || strpos($browser, "Aether") !== FALSE
    || strpos($browser, "m2e/") !== FALSE
    || strpos($browser, "Debian APT/") !== FALSE
    || strpos($browser, "developer fusion") !== FALSE
    || strpos($browser, "Genuitec") !== FALSE
    || strpos($browser, "netBeans") !== FALSE
    || strpos($browser, "Nexus") !== FALSE
    || strpos($browser, "okhttp") !== FALSE
    ) {
     echo "404 Not Found";
  }
  else {
    $_SERVER['REQUEST_URI'] = str_replace("?d", "", $_SERVER['REQUEST_URI']);
    $dir = $_SERVER['DOCUMENT_ROOT'] . urldecode($_SERVER['REQUEST_URI']);
    $dir_html = "";
    $is_p2 = false;

    if(is_dir($dir)) {
      $files = array();
      $dirs = array();
      if ($dh = opendir($dir)) {
        $dir_html = "<h2>Directory Contents</h2><div id='dirlist'>";
        while (($file = readdir($dh)) !== false) {
          if (filetype($dir . $file) == "dir") {
            $dirs[] = $file;
          }
          else {
            $files[] = $file;

            if(strpos($file, "artifacts.jar") !== FALSE
            || strpos($file, "artifacts.xml") !== FALSE
            || strpos($file, "compositeArtifacts.jar") !== FALSE
            || strpos($file, "compositeArtifacts.xml") !== FALSE) {
              # p2 repo
              $is_p2 = true;
            }
          }
        }
        closedir($dh);
        asort($dirs);
        asort($files);

        foreach ($dirs as $directory) {
          if($directory != "." ) {
            $dir_html .= "<img src='//dev.eclipse.org/small_icons/places/folder.png'><a href='" . $_SERVER['REQUEST_URI'] . "$directory/'> " . $directory . "</a><br />\n";
          }
        }
        foreach ($files as $file) {
          $dir_html .= "<img src='//dev.eclipse.org/small_icons/actions/edit-copy.png'><a href='" . $_SERVER['REQUEST_URI'] . "$file'> " . $file . "</a><br />\n";
        }

        $dir_html .= "</div>";
      }
      if($is_p2) {
        # p2
        $html = file_get_contents("404_p2.html");
      }
      else {
        $html = file_get_contents("404.html");
      }
      $html = str_replace("<!-- DNR:FILE -->", $dir_html, $html);
    }
    else {
      # Check archives
      $html = file_get_contents("404_nodoc.html");
      $message_html = "<h1>Not Found</h1>";
      $message_html .= "<p>We're sorry, the page or file cannot be found. Here are some reasons why:</p>";
      $message_html .= "<ul><li>A file may have moved to the archives. Please contact the project members on their user <a href='//eclipse.org/forums'>forum</a>.<br /></li>";
      $message_html .= "<li>Your file was part of a nightly or integration build which is no longer there. Simply download the latest version.</li><li>The project is uploading a new build, and this file is not there yet. Try again later.</li></ul>";
      $archive_dir = str_replace("download.eclipse.org", "archive.eclipse.org", $dir);
      if(is_dir($archive_dir)) {
        $message_html = "<h1>Moved to archives</h1>";
                          $message_html .= "<p>It appears this content was moved to the archives. You can try accessing this URL instead:<br /><br />";
        $message_html .= "&#160; &#160; <a href=\"//archive.eclipse.org" . $_SERVER['REQUEST_URI'] . "\">http://archive.eclipse.org" . $_SERVER['REQUEST_URI'] . "</a></p>";

        # doc title
        $html = str_replace("<title>Not Found</title>", "<title>Moved</title>", $html);

        # breadcrumb
        $html = str_replace("<li class=\"active\">Not Found</li>", "<li class=\"active\">Moved</li>", $html);
      }
      $html = str_replace("<!-- DNR:FILE -->", $message_html, $html);
    }
    echo $html;
  }