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

dmorley's avatar
dmorley committed
3 4 5 6 7 8 9
/**
 * Add a new pod.
 */

declare(strict_types=1);

use Poduptime\Logging;
noplanman's avatar
noplanman committed
10 11 12
use RedBeanPHP\R;

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

dmorley's avatar
dmorley committed
15 16 17 18 19 20 21 22
if (PHP_SAPI === 'cli' || PHP_SAPI === 'cgi-fcgi') {
    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
23

dmorley's avatar
dmorley committed
24
$log = new Logging();
dmorley's avatar
dmorley committed
25
$log->lfile($log_dir . '/add.log');
David Morley's avatar
David Morley committed
26
if (!($_domain = $_GET['domain'] ?? null)) {
dmorley's avatar
dmorley committed
27 28
    $log->lwrite('no domain given');
    die('no pod domain given');
29
}
David Morley's avatar
David Morley committed
30

noplanman's avatar
noplanman committed
31
// Other parameters.
David Morley's avatar
David Morley committed
32 33
$_email            = $_GET['email'] ?? '';
$_podmin_statement = $_GET['podmin_statement'] ?? '';
dmorley's avatar
dmorley committed
34
$_podmin_notify    = $_GET['podmin_notify'] ?? 0;
David Morley's avatar
David Morley committed
35

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

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

noplanman's avatar
noplanman committed
50
foreach ($pods as $pod) {
dmorley's avatar
dmorley committed
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
    if ($pod['domain'] === $_domain) {
        if ($pod['email']) {
            $log->lwrite('domain already exists and is registered to an owner' . $_domain);
            die('domain already exists and is registered to an owner, use the edit function to modify');
        }

        $digtxt = exec(escapeshellcmd('dig ' . $_domain . ' TXT +short'));
        if (strpos($digtxt, $pod['publickey']) === false) {
            $log->lwrite('domain already exists and can be registered' . $_domain);
            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
      <form method="get">
      <input type="hidden" name="edit">
David Morley's avatar
David Morley committed
80 81 82
      <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>
83
      <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>
David Morley's avatar
David Morley committed
84 85 86 87
      <label>Weight <input type="text" size="2" name="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>
      <input type="submit" name="action" value="save">
      </form>
EOF;
noplanman's avatar
noplanman committed
88

dmorley's avatar
dmorley committed
89
        die;
David Morley's avatar
David Morley committed
90
    }
dmorley's avatar
dmorley committed
91 92 93 94 95 96
}

$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'];
97 98
}

dmorley's avatar
cleanup  
dmorley committed
99
$chss = curl_init();
dmorley's avatar
dmorley committed
100
curl_setopt($chss, CURLOPT_URL, $link);
dmorley's avatar
cleanup  
dmorley committed
101 102 103 104 105 106 107
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);
108

dmorley's avatar
dmorley committed
109 110 111
if ($outputssl && stripos($outputssl, 'openRegistrations') !== false) {
    $log->lwrite('Your pod has ssl and is valid ' . $_domain);
    echo 'Your pod has ssl and is valid<br>';
dmorley's avatar
fixes  
dmorley committed
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
        R::store($p);
    } catch (\RedBeanPHP\RedException $e) {
        die('Error in SQL query: ' . $e->getMessage());
    }
127

dmorley's avatar
dmorley committed
128 129 130 131
    if ($_email) {
        $to      = $adminemail;
        $subject = 'New pod added to ' . $_SERVER['HTTP_HOST'];
        $headers = ['From: ' . $_email, 'Reply-To: ' . $_email, 'Cc: ' . $_email];
132

dmorley's avatar
dmorley committed
133 134 135 136 137
        $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!',
        ];
138

dmorley's avatar
dmorley committed
139 140
        @mail($to, $subject, implode("\r\n", $message_lines), implode("\r\n", $headers));
    }
noplanman's avatar
noplanman committed
141

dmorley's avatar
dmorley committed
142
    echo 'Data successfully inserted! Your pod will be checked and live on the list in a few hours!';
143

144
} else {
dmorley's avatar
dmorley committed
145 146
    $log->lwrite('Could not validate your pod, check your setup! ' . $_domain);
    echo 'Could not validate your pod, check your setup!<br>Take a look at <a href="' . $link . '">your /nodeinfo</a>';
147
}
dmorley's avatar
dmorley committed
148
$log->lclose();