From 97b47db49958fa6242d7b9a121d93489ac5bb71b Mon Sep 17 00:00:00 2001
From: Codeberg <codeberg@codeberg.org>
Date: Wed, 7 Oct 2020 15:48:57 +0200
Subject: [PATCH] codeberg.eu subdomain support

---
 var/www/pages/index.php | 59 ++++++++++++++++++++++++++++++-----------
 1 file changed, 43 insertions(+), 16 deletions(-)

diff --git a/var/www/pages/index.php b/var/www/pages/index.php
index 3242d11..85835a9 100644
--- a/var/www/pages/index.php
+++ b/var/www/pages/index.php
@@ -6,36 +6,62 @@ function send_response($code, $message = "") {
     exit();
 }
 
+$domain_parts = explode('.', $_SERVER['HTTP_HOST']);
+$subdomain = implode(".", array_slice($domain_parts, 0, -2));
+$tld = end($domain_parts);
+
 $request_uri = explode("?", $_SERVER["REQUEST_URI"])[0];
 $request_url = filter_var($request_uri, FILTER_SANITIZE_URL);
 $request_url = str_replace("%20", " ", $request_url);
+$request_url_parts = explode("/", $request_url);
+$request_url_parts = array_diff($request_url_parts, array("")); # Remove empty parts in URL
 
-if ($request_url === "/" and $_SERVER["HTTP_HOST"] === "codeberg.eu") {
+if ($tld === "org") {
+    $subdomain_repo = array(
+        "docs" => "docs",
+        "fonts" => "codeberg-fonts",
+        "get-it-on" => "get-it-on"
+    );
+    if (array_key_exists($subdomain, $subdomain_repo)) {
+        $owner = $subdomain_repo[$subdomain];
+    } else {
+        $owner = strtolower(array_shift($request_url_parts));
+        if (!$owner) {
+            header("Location: https://codeberg.eu");
+            exit;
+	}
+	if (strpos($owner, ".") === false) {
+            $h = "Location: https://" . $owner . ".codeberg.eu/" . implode("/", $request_url_parts);
+            if ($_SERVER['QUERY_STRING'] !== "")
+                $h .= "?" . $_SERVER['QUERY_STRING'];
+            header($h);
+            exit;
+        }
+    }
+} else {
+    $owner = strtolower($subdomain);
+    if (strpos($owner, ".") !== false)
+        send_response(200, "Pages not supported for user names with dots. Please rename your username to use Codeberg pages.");
+}
+
+if ($owner == "codeberg-fonts" || $owner == "get-it-on")
+    header("Access-Control-Allow-Origin: *");
+
+if (!$owner) {
     send_response(200, file_get_contents("./default-page.html"));
 }
 
 # Restrict allowed characters in request URI:
-if (preg_match("/^\/[a-zA-Z0-9_ +\-\/\.]*\$/", $request_url) != 1) {
+if (preg_match("/^\/[a-zA-Z0-9_ +\-\/\.]*\$/", $request_url) != 1)
     send_response(404, "invalid request URL");
-}
 
 $git_prefix = "/data/git/gitea-repositories";
-$parts = explode("/", $request_url);
-$parts = array_diff($parts, array("")); # Remove empty parts in URL
-
-$parts_dot = explode(".",$_SERVER["HTTP_HOST"]);
-if (count($parts_dot) != 3) {
-    send_response(404, "invalid subdomain");
-}
-$owner = $parts_dot[0];
-
 $git_root = realpath("$git_prefix/$owner/pages.git");
-$file_url = implode("/", $parts);
+$file_url = implode("/", $request_url_parts);
 
 # Ensure that only files within $git_root are accessed:
-if (substr($git_root, 0, strlen($git_prefix)) !== $git_prefix) {
+if (substr($git_root, 0, strlen($git_prefix)) !== $git_prefix)
     send_response(404, "this user/organization does not have codeberg pages");
-}
 
 # If this is a folder, we explicitly redirect to folder URL, otherwise browsers will construct invalid relative links:
 $command = "sh -c \"cd '$git_root' && /usr/bin/git ls-tree 'HEAD:$file_url' > /dev/null\"";
@@ -91,7 +117,7 @@ if ($retval == 0 && count($output)) {
     $revision=$output[0];
     header('ETag: "' . $revision . '"');
     if (isset($_SERVER["HTTP_IF_NONE_MATCH"])) {
-	$req_revision = str_replace('"', '', str_replace('W/"', '', $_SERVER["HTTP_IF_NONE_MATCH"]));
+        $req_revision = str_replace('"', '', str_replace('W/"', '', $_SERVER["HTTP_IF_NONE_MATCH"]));
         if ($req_revision === $revision) {
             send_response(304);
         }
@@ -119,3 +145,4 @@ if ($retval != 0) {
 
 ## If we could directly exec+echo raw output from above, we wouldn't need to execute command twice:
 passthru($command);
+