<?php
/**
 * Copyright (c) 2013-2015, 2018 Eclipse Foundation.
 *
 * 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/
 *
 * Contributors:
 * Christopher Guindon (Eclipse Foundation)- initial API and implementation
 * Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */

require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
$App = new App();
$Nav = new Nav();
$Theme = $App->getThemeClass();
include ("_projectCommon.php");


$pageTitle = "Eclipse mirror sites";
$Theme->setPageTitle($pageTitle);
$Theme->setPageKeywords('eclipse,download,mirror');
$Theme->setPageAuthor('Eclipse Foundation, Inc.');

require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_rw.class.php";
require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/mirrors/mirror.class.php");

$_status = $App->getHTTPParameter('status');

$error = 0;

if ($_status == "") {
  $_status = "new";
}

$dbc = new DBConnectionRW();
$dbh = $dbc->connect();

$App = new App();
$Mirror = new Mirror();

if ($_status == "save") {

  $MIR_REQ = $_COOKIE['MIR_REQ'];
  if ($MIR_REQ == "") {

    $valid = true;
    $errorfield = "";
    $alnumspace = "^[][a-zA-Z0-9 .'&,_-]+$";

    // validate incoming
    if (!eregi($alnumspace, $_POST['organization'])) {
      $errorfield .= " Organization";
      $valid = false;
    }
    if (!eregi('^[a-zA-Z]{2}$', $_POST['ccode'])) {
      $errorfield .= " Country";
      $valid = false;
    }
    if (!eregi($alnumspace, $_POST['contact'])) {
      $errorfield .= " Contact";
      $valid = false;
    }

    if (!eregi("^https:\/\/", $_POST['http_browserlink']) && $_POST['http_browserlink'] != "") {
      $errorfield .= " HTTP URL";
      $valid = false;
    }
    if (!eregi('^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z.]{2,5}$', $_POST['email'])) {
      $errorfield .= " E-mail address";
      $valid = false;
    }

    if (!$Mirror->isValidPublicIP($_POST['update_ip_allow'])) {
      $errorfield .= " IP Address";
      $valid = false;
    }

    if ($valid) {
      $sql = "
              INSERT INTO mirrors (
                organization,
                ccode,
                update_ip_allow,
                email,
                date_enabled,
                create_status,
                contact)
              VALUES (
                " . $App->returnQuotedString($_POST['organization']) . ",
                " . $App->returnQuotedString($_POST['ccode']) . ",
                " . $App->returnQuotedString($_POST['update_ip_allow']) . ",
                " . $App->returnQuotedString($_POST['email']) . ",
                NOW(),
                " . $App->returnQuotedString("approve") . ",
                " . $App->returnQuotedString($_POST['contact']) . ")
        ";
      mysql_query($sql, $dbh);
      $mirror_id = mysql_insert_id();

      // add protocols.
      if ($_POST["http_browserlink"] != "") {
        $sql = "
                  INSERT INTO mirror_protocols (
                    mirror_id,
                    protocol,
                    base_path)
                  VALUES (
                    " . $mirror_id . ",
                    " . $App->returnQuotedString("https") . ",
                    " . $App->returnQuotedString($_POST['http_browserlink']) . ")
          ";
        mysql_query($sql, $dbh);

        $drop_list = $_POST["drop_id"];
        foreach (split(",", $drop_list) as $drop) {
          $sql = "
                    INSERT INTO mirror_drops (
                      mirror_id,
                      drop_id,
                      protocol)
                    VALUES (
                      " . $mirror_id . ",
                      " . $App->returnQuotedString("EclipseFull") . ",
                      " . $App->returnQuotedString("https") . ")";
          mysql_query($sql, $dbh);
        }
      }
      // Place cookie on browser to avoid having multiple submissions
      setcookie("MIR_REQ", "1");
    }
    else {
      $error = 2;
    }
  }
  else {
    $error = 1;
  }
}
else {
  $sql = "SELECT
          DRP.drop_id,
          DRP.project_id,
          DRP.description,
          IFNULL((
            SELECT
              disk_space
            FROM project_disk_space_usage AS DSK
            WHERE DSK.project_id = DRP.project_id AND DSK.is_quota=1
            )
            ,DRP.size) AS size,
          DRP.size_unit,
          DRP.is_default_selection,
          PRJ.level,
          PRJ.sort_order
        FROM drops AS DRP
          LEFT JOIN projects as PRJ ON PRJ.project_id = DRP.project_ID
        ORDER BY DRP.sort_order
    ";

  $rs = mysql_query($sql, $dbh);

  $sql = "SELECT
          ccode,
          en_description
        FROM SYS_countries
        ORDER BY en_description
    ";

  $rs_country = mysql_query($sql, $dbh);
}

// Place your html content in a file called content/en_pagename.php
include ("content/en_" . $App->getScriptName());

$dbc->disconnect();
$dbc = null;

$Theme->setHtml($html);
$Theme->setNav($Nav);
$Theme->generatePage();