summaryrefslogtreecommitdiff
path: root/download/index.php
blob: 0fd6f2677d711e369d7de1fadbdc445187774079 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?php

if (count(array_keys($_GET)) < 4 || !isset($_GET['_'])) {
    die("Missing operand");
}

$projects = array_map(function ($id) {
    return json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/fetcher/projects/" . $id), true);
}, array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/fetcher/projects"), function ($i) {
    return str_ends_with($i, ".json");
}));

$projectsList = array_map(function ($project) {
    return $project['id'];
}, $projects);

$sel = trim(array_keys($_GET)[0]);
if (!in_array($sel, $projectsList)) {
    die("Invalid project");
}

$project = array_filter($projects, function ($i) use ($sel) {
    return $i['id'] === $sel;
});
sort($project);
$project = $project[0];

$branchList = array_map(function ($i) {
    return $i['id'];
}, $project['channels']);

$selb = trim(array_keys($_GET)[1]);
if (!in_array($selb, $branchList)) {
    die("Invalid channel");
}

$channel = array_filter($project['channels'], function ($i) use ($selb) {
    return $i['id'] === $selb;
});
sort($channel);
$channel = $channel[0];

$buildsList = array_map(function ($i) {
    return $i['id'];
}, $channel['builds']);

$selc = trim(array_keys($_GET)[2]);
if (!in_array($selc, $buildsList)) {
    die("Invalid build ID");
}

$build = array_filter($channel['builds'], function ($i) use ($selc) {
    return $i['id'] == $selc;
});
sort($build);
$build = $build[0];

$artifactsList = array_map(function ($i) {
    return $i['name'];
}, $build['artifacts']);

$sela = trim($_GET['_']);
if (!in_array($sela, $artifactsList)) {
    die("Invalid artifact name");
}

$artifact = array_filter($build['artifacts'], function ($i) use ($sela) {
    return $i['name'] == $sela;
});
sort($artifact);
$artifact = $artifact[0];

$url = $artifact["download"];
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer " . trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/fetcher/token.txt")) ]);

$response = array_map(function ($i) {
    $p = explode(":", trim($i));
    $p1 = $p[0];
    array_shift($p);
    return [$p1, trim(implode(":", $p))];
}, array_filter(explode("\n", curl_exec($ch)), function ($i) {
    return trim($i) !== "" && str_contains(trim($i), ":") && str_starts_with(trim($i), "content-");
}));
$headers = [];
foreach ($response as $header) {
    $headers[$header[0]] = $header[1];
}
curl_close($ch);

header("Content-Type: " . $headers["content-type"]);
header("Content-Disposition: attachment; filename=\"" . $headers["content-disposition"] . "\"");
header("Content-Length: " . $headers["content-length"]);

$resource = curl_init();
curl_setopt($resource, CURLOPT_UNRESTRICTED_AUTH, 1);
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HTTPHEADER, [ "Authorization: Bearer " . trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/fetcher/token.txt")) ]);
curl_exec($resource);
curl_close($resource);