Ermögliche das Hinzufügen externer Domains
Bernd Wurst

Bernd Wurst commited on 2018-02-20 11:35:38
Zeige 8 geänderte Dateien mit 295 Einfügungen und 2 Löschungen.

... ...
@@ -0,0 +1,17 @@
1
+
2
+
3
+
4
+
5
+$(document).ready(function(){
6
+    $('div#buttons').show();
7
+    $('div#transfer').hide();
8
+    $('div#external').hide();
9
+
10
+    $('button#domain-external').click( function() {
11
+        $('div#transfer').hide();
12
+        $('div#buttons').hide();
13
+        $('div#external').show();
14
+    });
15
+    $(".buttonset").buttonset();
16
+ 
17
+});
... ...
@@ -0,0 +1,131 @@
1
+<?php
2
+/*
3
+This file belongs to the Webinterface of schokokeks.org Hosting
4
+
5
+Written 2008-2018 by schokokeks.org Hosting, namely
6
+  Bernd Wurst <bernd@schokokeks.org>
7
+  Hanno Böck <hanno@schokokeks.org>
8
+
9
+To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.
10
+
11
+You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see 
12
+http://creativecommons.org/publicdomain/zero/1.0/
13
+
14
+Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code.
15
+*/
16
+
17
+require_once('inc/security.php');
18
+require_once('inc/icons.php');
19
+require_once('inc/jquery.php');
20
+javascript();
21
+
22
+require_once('domainapi.php');
23
+require_once('domains.php');
24
+
25
+require_role(ROLE_CUSTOMER);
26
+
27
+title("Domain hinzufügen");
28
+$section='domains_domains';
29
+
30
+output('<p>Mit dieser Funktion können Sie eine neue Domain bestellen oder eine bestehende, extern registrierte Domain verfügbar machen.</p>');
31
+
32
+$form = '<p>Domainname: <input type="text" name="domain" size="50" /> <input type="submit" value="Verfügbarkeit prüfen" />';
33
+
34
+output(html_form('adddomain_search', '', '', $form));
35
+
36
+if (isset($_REQUEST['domain'])) {
37
+    if (strpos($_REQUEST['domain'], ' ') !== false) {
38
+        warning('Leerzeichen sind in Domainnamen nicht erlaubt.');
39
+        redirect('');
40
+    }
41
+    $avail = api_domain_available($_REQUEST['domain']);
42
+    if ($avail == 'available') {
43
+        output('<p class="domain-available">Die Domain '.filter_input_general($_REQUEST['domain']).' ist verfügbar!</p>');
44
+        # Neue Domain eintragen
45
+        $data = get_domain_offer($_REQUEST['domain']);
46
+        if (!$data) {
47
+            redirect('');
48
+        }
49
+        $form = '<p>Folgende Konditionen gelten bei Registrierung der Domain im nächsten Schritt:</p>
50
+            <table>
51
+            <tr><td>Domainname:</td><td><strong>'.$data['domainname'].'</strong></td></tr>
52
+            <tr><td>Jahresgebühr:</td><td style="text-align: right;">'.$data['gebuehr'].' €</td></tr>
53
+            <tr><td>Setup-Gebühr (einmalig):</td><td style="text-align: right;">'.$data['setup'].' €</td></tr>';
54
+        $users = list_useraccounts();
55
+        if (count($users) > 1) {
56
+            $userselect = array();
57
+            foreach ($users as $u) {
58
+                $userselect[$u['uid']] = $u['username'].' / '.$u['name'];
59
+            }
60
+
61
+
62
+            $form .= '<tr><td>Benutzeraccount:</td><td>'.html_select('uid', $userselect).'</td></tr>';
63
+        }
64
+        $form .='</table>';
65
+
66
+
67
+        $form .= '<p><input type="hidden" name="domain" value="'.filter_input_general($_REQUEST['domain']).'">
68
+            <input type="submit" name="submit" value="Ich möchte diese Domain registrieren"></p>';
69
+        output(html_form('domains_register', 'domainreg', '', $form));
70
+        output('<p>'.internal_link('domains', 'Zurück').'</p>');
71
+    } elseif ($avail == 'registered' || $avail == 'alreadyRegistered') {
72
+        output('<p class="domain-unavailable">Die Domain '.filter_input_general($_REQUEST['domain']).' ist bereits vergeben.</p>');
73
+        
74
+        output('<h3>Domain zu '.config('company_name').' umziehen</h3>');
75
+        $data = get_domain_offer($_REQUEST['domain']);
76
+
77
+        if (! $data) {
78
+            // Die Include-Datei setzt eine passende Warning-Nachricht
79
+            output('<p>Eine Registrierung ist nicht automatisiert möglich. Bitte wenden Sie sich an den Support.');
80
+        } else {
81
+
82
+            $form = '<p>Folgende Konditionen gelten beim Transfer der Domain im nächsten Schritt:</p>
83
+                <table>
84
+                <tr><td>Domainname:</td><td><strong>'.$data['domainname'].'</strong></td></tr>
85
+                <tr><td>Jahresgebühr:</td><td style="text-align: right;">'.$data['gebuehr'].' €</td></tr>
86
+                <tr><td>Setup-Gebühr (einmalig):</td><td style="text-align: right;">'.$data['setup'].' €</td></tr>';
87
+            $form .='</table>';
88
+
89
+
90
+            $form .= '<p><input type="hidden" name="domain" value="'.filter_input_general($_REQUEST['domain']).'">
91
+                <input type="submit" name="submit" value="Ich möchte diese Domain zu '.config('company_name').' umziehen"></p>';
92
+
93
+            output(html_form('domains_transferin', 'domainreg', '', $form));
94
+
95
+        }
96
+        output('<h3>Diese Domain als externe Domain nutzen</h3>');
97
+        output('<p>Sie können diese Domain für Konfigurationen bei uns nutzen ohne einen Transfer vorzunehmen.</p>
98
+        <p><strong>Beachten Sie:</strong> Um diese Domain nutzen zu können, benötigen Sie bei Ihrem bisherigen Domainregistrar die Möglichkeit, DNS-Records anzulegen oder die zuständigen DNS-Server zu ändern. Sie können dann entweder unsere DNS-Server nutzen oder einzelne DNS-Records auf unsere Server einrichten.</p>');
99
+
100
+        output('<p>Mit Betätigen des unten stehenden Knopfes bestätigen Sie, dass Sie entweder der Domaininhaber sind oder mit expliziter Zustimmung des Domaininhabers handeln.</p>');
101
+        $form = '<p class="buttonset" id="buttonset-external">
102
+            <input type="radio" name="dns" id="option-dns-enable" value="enable" />
103
+            <label for="option-dns-enable">Lokalen DNS-Server aktivieren</label>
104
+            <input type="radio" name="dns" id="option-dns-disable" value="disable" checked="checked" />
105
+            <label for="option-dns-disable">Weiterhin externen DNS verwenden</label>
106
+            </p>';
107
+
108
+        $form .= '<p><input type="hidden" name="domain" value="'.filter_input_general($_REQUEST['domain']).'">
109
+            <input type="submit" name="submit" value="Diese Domain bei '.config('company_name').' verwenden"></p>';
110
+
111
+        output(html_form('domains_external', 'useexternal', '', $form));
112
+        output('</div>');
113
+
114
+    } else {
115
+        output('<p class="domain-unavailable">Die Domain '.filter_input_general($_REQUEST['domain']).' kann nicht registriert werden.</p>');
116
+
117
+        switch ($avail) {
118
+            case 'nameContainsForbiddenCharacter':
119
+                output('<p>Der Domainname enthält unerlaubte Zeichen.</p>');
120
+                break;
121
+            case 'suffixDoesNotExist':
122
+            case 'suffixCannotBeRegistered':
123
+                output('<p>Diese Endung ist nicht verfügbar.</p>');
124
+                break;
125
+            default:
126
+                output('<p>Ein Fehler ist aufgetreten beim Prüfen der Verfügbarkeit. Eventuell geht es später wieder.</p>');
127
+
128
+        }
129
+    }
130
+
131
+}
... ...
@@ -88,7 +88,7 @@ foreach ($user_domains as $domain)
88 88
 }
89 89
 output('</table>');
90 90
 output("<br />");
91
-
91
+addnew('adddomain', 'Neue Domain bestellen / hinzufügen');
92 92
 
93 93
 
94 94
 ?>
... ...
@@ -98,3 +98,22 @@ function api_upload_domain($fqdn)
98 98
 }   
99 99
 
100 100
 
101
+function api_domain_available($domainname) 
102
+{
103
+    $args = array("domainNames" => array($domainname));
104
+    $result = api_request('domainStatus', $args);
105
+    $resp = $result["responses"][0];
106
+    return $resp["status"];
107
+    /*
108
+    alreadyRegistered 	You (or a sub account) already registered the domain
109
+    registered 	Somebody else registered domain
110
+    nameContainsForbiddenCharacter 	Domain name contains invalid characters
111
+    available 	Domain is available for registration
112
+    suffixDoesNotExist 	Domain suffix does not exist
113
+    suffixCannotBeRegistered 	You are not allowed to register a domain with this suffix
114
+    canNotCheck 	System is currently unable to check availability
115
+    unknown 	Other problems or difficulties occured
116
+    */
117
+}
118
+
119
+
... ...
@@ -185,4 +185,75 @@ function get_txt_record($hostname, $domainname, $tld) {
185 185
 }
186 186
 
187 187
 
188
+function list_useraccounts()
189
+{
190
+  $customerno = (int) $_SESSION['customerinfo']['customerno'];
191
+  $result = db_query("SELECT uid,username,name FROM system.useraccounts WHERE kunde=?", array($customerno));
192
+  $ret = array();
193
+  while ($item = $result->fetch())
194
+  {
195
+    $ret[] = $item;
196
+  }
197
+  DEBUG($ret);
198
+  return $ret;
199
+}
200
+
201
+
202
+function get_domain_offer($domainname) 
203
+{
204
+  $domainname = filter_input_hostname($domainname);
205
+  $domainname = preg_replace('/^www\./', '', $domainname);
206
+
207
+  $basename = preg_replace('/([^\.]+)\..*$/', '\1', $domainname);
208
+  DEBUG('Found Basename: '.$basename);
209
+  $tld = preg_replace('/^[^\.]*\./', '', $domainname);
210
+  DEBUG('Found TLD: '.$tld);
211
+
212
+  $cid = (int) $_SESSION['customerinfo']['customerno'];
213
+
214
+  $result = db_query("SELECT id FROM kundendaten.domains WHERE domainname=:domainname AND tld=:tld", array("domainname" => $basename, "tld" => $tld));
215
+  if ($result->rowCount() != 0) {
216
+    warning('Diese Domain ist in unserem System bereits vorhanden und kann daher nicht noch einmal eingetragen werden.');
217
+    return;
218
+  }
219
+
220
+  $data = array("domainname" => $domainname, "basename" => $basename, "tld" => $tld);
221
+
222
+  $result = db_query("SELECT tld, gebuehr, setup FROM misc.domainpreise_kunde WHERE kunde=:cid AND tld=:tld AND ruecksprache='N'", array(":cid" => $cid, ":tld" => $tld));
223
+  if ($result->rowCount() != 1) {
224
+    $result = db_query("SELECT tld, gebuehr, setup FROM misc.domainpreise WHERE tld=:tld AND ruecksprache='N'", array(":tld" => $tld));
225
+  }
226
+  if ($result->rowCount() != 1) {
227
+    warning('Die Endung »'.$tld.'« steht zur automatischen Eintragung nicht zur Verfügung.');
228
+    return;
229
+  }
230
+  $temp = $result->fetch();
231
+  $data["gebuehr"] = $temp["gebuehr"];
232
+  $data["setup"] = ($temp["setup"] ? $temp["setup"] : 0.0);
233
+  
234
+  return $data;
235
+}
236
+
237
+
238
+function insert_domain_external($domain, $dns)
239
+{
240
+    $cid = (int) $_SESSION['customerinfo']['customerno'];
241
+    if (strpos($domain, ' ') !== false) {
242
+        system_failure("Ungültige Zeichen im Domainname");
243
+    }
244
+    $parts = explode('.', $domain);
245
+    if (count($parts) !== 2) {
246
+        system_failure("Ungültiger Domainname");
247
+    }
248
+    $domainname = $parts[0];
249
+    $tld = $parts[1];
250
+    db_query("INSERT INTO kundendaten.domains (kunde, domainname, tld, billing, provider, dns, mailserver_lock) VALUES 
251
+        (?, ?, ?, 'external', 'other', 0, 1)", array($cid, $domainname, $tld));
252
+    $id = db_insert_id();
253
+    if ($dns) {
254
+        db_query("UPDATE kundendaten.domains SET dns=1 WHERE id=?", array($id));
255
+    }
256
+    return $id;
257
+}
258
+
188 259
 
... ...
@@ -0,0 +1,21 @@
1
+
2
+p.domain-unavailable {
3
+    padding: 1em;
4
+    background: #faa;
5
+    border: 2px solid #f00;
6
+    font-weight: bold;
7
+    font-size: 200%;
8
+}
9
+p.domain-available {
10
+    padding: 1em;
11
+    background: #afa;
12
+    border: 2px solid #0f0;
13
+    font-weight: bold;
14
+    font-size: 200%;
15
+}
16
+
17
+div#buttons {
18
+    display: none;
19
+}
20
+
21
+
... ...
@@ -0,0 +1,34 @@
1
+<?php
2
+/*
3
+This file belongs to the Webinterface of schokokeks.org Hosting
4
+
5
+Written 2008-2018 by schokokeks.org Hosting, namely
6
+  Bernd Wurst <bernd@schokokeks.org>
7
+  Hanno Böck <hanno@schokokeks.org>
8
+
9
+To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.
10
+
11
+You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see 
12
+http://creativecommons.org/publicdomain/zero/1.0/
13
+
14
+Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code.
15
+*/
16
+
17
+require_once('inc/security.php');
18
+require_once('inc/icons.php');
19
+
20
+require_once('domains.php');
21
+require_role(ROLE_CUSTOMER);
22
+
23
+title("Externe Domain hinzufügen");
24
+$section='domains_domains';
25
+
26
+if (!isset($_REQUEST['domain'])) {
27
+    system_failure('Kein Domainname übergeben');
28
+}
29
+
30
+$id = insert_domain_external($_REQUEST['domain'], ($_REQUEST['dns'] === 'enable'));
31
+
32
+redirect('verify?id='.$id);
33
+
34
+
... ...
@@ -56,7 +56,7 @@ $section = 'domains_domains';
56 56
 output('<p>Bitte wenden Sie eine der unten genannten Methoden an um die Domain-Inhaberschaft zu bestätigen. Erst nach diesem Schritt können Sie diese Domain bei uns als Mail-Domain nutzen.</p>');
57 57
 output('<p>Die Zeichenkette zur Bestätigung lautet <strong>'.$dom->secret.'</strong>.</p>');
58 58
 output('<p>Richten Sie bitte auf dem zuständigen DNS-Server einen DNS-Record vom Typ TXT unter dem Hostname <strong>_schokokeks.'.$dom->fqdn.'</strong> ein und hinterlegen Sie dort diese Zeichenkette als Inhalt:</p>
59
-<p><code>_schokokeks.'.$dom->fqdn.'    IN TXT "'.$dom->secret.'"</code></p>
59
+<p><code>_schokokeks.'.$dom->fqdn.'.    IN TXT "'.$dom->secret.'"</code></p>
60 60
 <p>Beachten Sie, dass Aktualisierungen am DNS-Server i.d.R. mit einigen Minuten verzögerung abgerufen werden können.</p>');
61 61
 #output('<p>Sie können diese entweder als DNS-Record vom Typ TXT unter dem Hostname <strong>_schokokeks.'.$dom->fqdn.'</strong> einrichten oder auf dem zuständigen Webserver eine Datei hinterlegen mit dem Code als Inhalt und der Abruf-URL <strong>http://'.$dom->fqdn.'/'.$dom->secret.'.txt</strong></p>');
62 62
 output('<p>'.internal_link('', other_icon('refresh.png').' Diese Seite neu laden um den DNS-Record zu prüfen', "id={$dom->id}&ts=".time()).'</p>');
63 63