add.php 4.92 KB
Newer Older
David Morley's avatar
David Morley committed
1
<?php
noplanman's avatar
noplanman committed
2

3 4 5 6 7 8
/**
 * Add a new pod.
 */

declare(strict_types=1);

noplanman's avatar
noplanman committed
9 10 11
use RedBeanPHP\R;

require_once __DIR__ . '/../vendor/autoload.php';
dmorley's avatar
dmorley committed
12
require_once __DIR__ . '/../config.php';
noplanman's avatar
noplanman committed
13

dmorley's avatar
dmorley committed
14

dmorley's avatar
dmorley committed
15 16 17 18 19 20 21
define('PODUPTIME', microtime(true));

// Set up global DB connection.
R::setup("pgsql:host={$pghost};dbname={$pgdb}", $pguser, $pgpass, true);
R::testConnection() || die('Error in DB connection');
R::usePartialBeans(true);

noplanman's avatar
noplanman committed
22

David Morley's avatar
David Morley committed
23
if (!($_domain = $_GET['domain'] ?? null)) {
24
    die('no pod domain given');
25
}
David Morley's avatar
David Morley committed
26

noplanman's avatar
noplanman committed
27
// Other parameters.
David Morley's avatar
David Morley committed
28 29
$_email            = $_GET['email'] ?? '';
$_podmin_statement = $_GET['podmin_statement'] ?? '';
dmorley's avatar
dmorley committed
30
$_podmin_notify    = $_GET['podmin_notify'] ?? 0;
David Morley's avatar
David Morley committed
31

David Morley's avatar
David Morley committed
32 33
$_domain = strtolower($_domain);
if (!filter_var(gethostbyname($_domain), FILTER_VALIDATE_IP)) {
34
    die('Could not validate the domain name, be sure to enter it as "domain.com" (no caps, no slashes, no extras)');
35
}
36

noplanman's avatar
noplanman committed
37
try {
38
    $pods = R::getAll('
39
    SELECT id, domain, publickey, email
noplanman's avatar
noplanman committed
40 41 42
    FROM pods
  ');
} catch (\RedBeanPHP\RedException $e) {
43
    die('Error in SQL query: ' . $e->getMessage());
noplanman's avatar
noplanman committed
44
}
45

noplanman's avatar
noplanman committed
46
foreach ($pods as $pod) {
47 48 49 50 51 52
    if ($pod['domain'] === $_domain) {
        if ($pod['email']) {
            die('domain already exists and is registered to an owner, use the edit function to modify');
        }

        $digtxt = exec(escapeshellcmd('dig ' . $_domain . ' TXT +short'));
dmorley's avatar
dmorley committed
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
        if (strpos($digtxt, $pod['publickey']) === false) {
            die('domain already exists, you can claim the domain by adding a DNS TXT record that states<br><b> ' . $_domain . ' IN TXT "' . $pod['publickey'] . '"</b>');
        }

        echo 'domain validated, you can now add details ';
        $uuid   = md5(uniqid($_domain, true));
        $expire = time() + 2700;

        try {
            $p                = R::load('pods', $pod['id']);
            $p['token']       = $uuid;
            $p['tokenexpire'] = date('Y-m-d H:i:s', $expire);

            R::store($p);
        } catch (\RedBeanPHP\RedException $e) {
            die('Error in SQL query: ' . $e->getMessage());
        }

        echo <<<EOF
dmorley's avatar
dmorley committed
72 73 74 75 76 77
      <script>
      window.onload = function() {
          $("#weight").ionRangeSlider();
      }
      </script>
      <form action="/">
dmorley's avatar
dmorley committed
78
      <input type="hidden" name="edit">
David Morley's avatar
David Morley committed
79 80 81
      <input type="hidden" name="domain" value="{$_domain}">
      <input type="hidden" name="token" value="{$uuid}">
      <label>Email <input type="text" size="20" name="email"></label><br>
82
      <label>Podmin Statement (You can include links to your terms and policies and information about your pod you wish to share with users.) <br><textarea cols="100" rows="7" name="podmin_statement"></textarea></label><br>
dmorley's avatar
dmorley committed
83
      <label>Weight <input type="text" data-min="0" data-step="1" data-max="10" name="weight" id="weight"> This lets you weight your pod lower on the list if you have too much traffic coming in, 10 is the norm use lower to move down the list.</label><br>
David Morley's avatar
David Morley committed
84 85 86
      <input type="submit" name="action" value="save">
      </form>
EOF;
noplanman's avatar
noplanman committed
87

dmorley's avatar
dmorley committed
88
        $stop = 1;
David Morley's avatar
David Morley committed
89
    }
90 91
}

dmorley's avatar
dmorley committed
92
if (!$stop) {
93

dmorley's avatar
dmorley committed
94 95 96 97
    $link = 'https://' . $_domain . '/nodeinfo/1.0';
    if ($infos = file_get_contents('https://' . $_domain . '/.well-known/nodeinfo')) {
        $info = json_decode($infos, true);
        $link = max($info['links'])['href'];
98
    }
99

dmorley's avatar
dmorley committed
100 101 102 103 104 105 106 107 108
    $chss = curl_init();
    curl_setopt($chss, CURLOPT_URL, $link);
    curl_setopt($chss, CURLOPT_POST, 0);
    curl_setopt($chss, CURLOPT_HEADER, 0);
    curl_setopt($chss, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($chss, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($chss, CURLOPT_NOBODY, 0);
    $outputssl = curl_exec($chss);
    curl_close($chss);
109

dmorley's avatar
dmorley committed
110 111
    if ($outputssl && stripos($outputssl, 'openRegistrations') !== false) {
        echo 'Your pod has ssl and is valid<br>';
112

dmorley's avatar
dmorley committed
113
        $publickey = md5(uniqid($_domain, true));
noplanman's avatar
noplanman committed
114

dmorley's avatar
dmorley committed
115 116 117 118 119 120 121
        try {
            $p = R::dispense('pods');
            $p['domain'] = $_domain;
            $p['email'] = $_email;
            $p['podmin_statement'] = $_podmin_statement;
            $p['podmin_notify'] = $_podmin_notify;
            $p['publickey'] = $publickey;
122

dmorley's avatar
dmorley committed
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
            R::store($p);
        } catch (\RedBeanPHP\RedException $e) {
            die('Error in SQL query: ' . $e->getMessage());
        }

        if ($_email) {
            $to = $adminemail;
            $subject = 'New pod added to ' . $_SERVER['HTTP_HOST'];
            $headers = ['From: ' . $_email, 'Reply-To: ' . $_email, 'Cc: ' . $_email];

            $message_lines = [
                'https://' . $_SERVER['HTTP_HOST'],
                'Your pod ' . $_domain . ' will not show up right away, as it needs to pass a few checks first.',
                'Give it a few hours!',
            ];

            @mail($to, $subject, implode("\r\n", $message_lines), implode("\r\n", $headers));
        }

        echo 'Data successfully inserted! Your pod will be checked and live on the list in a few hours!';

    } else {
        echo 'Could not validate your pod, check your setup!<br>Take a look at <a href="' . $link . '">your /nodeinfo</a>';
    }
}