Issues (3)

cloudflare/cloudflare.php (3 issues)

Severity
1
<?php
2
3
include 'CloudflareConnection.php';
4
5
class cloudflare
6
{
7
    public $Error;
8
    public $Warning;
9
    public $Success;
10
11
    public function __construct()
12
    {
13
        $this->Error = [];
14
        $this->Warning = [];
15
        $this->Success = [];
16
17
        $this->loadLanguageArray(LANGUAGE_CODE);
18
    }
19
20
    /** Settings for the integration, these are shown when you add/edit a DNS integration
21
     *
22
     * @return string
23
     */
24
    public function getPlatformSettings()
25
    {
26
        // example of html for the integration settings
27
        $html = '';
28
        $html .= '<strong class="title">'.__('username', 'cloudflare').'</strong>';
29
        $html .= '<input type="text" class="text1 size1" name="module[dnsmanagement][Settings][username]" value="'.((isset($this->Settings->username)) ? htmlspecialchars($this->Settings->username) : '').'"><br><br>';
30
        $html .= '<strong class="title">'.__('api_key', 'cloudflare').'</strong>';
31
        $html .= '<input type="text" class="text1 size1" name="module[dnsmanagement][Settings][api_key]" value="'.((isset($this->Settings->api_key)) ? htmlspecialchars($this->Settings->api_key) : '').'"><br><br>';
32
        $html .= '<strong class="title">'.__('account_id', 'cloudflare').'</strong>';
33
        $html .= '<input type="text" class="text1 size1" name="module[dnsmanagement][Settings][account_id]" value="'.((isset($this->Settings->account_id)) ? htmlspecialchars($this->Settings->account_id) : '').'"><br><br>';
34
        $html .= '<strong class="title">'.__('allow_zone_removal', 'cloudflare').'</strong>';
35
        $html .= '<select class="text1 size4" name="module[dnsmanagement][Settings][allow_zone_removal]">
36
            <option value="no" '.($this->Settings->allow_zone_removal === 'no' ? 'selected' : '').'>'.__('no', 'cloudflare').'</option>
37
            <option value="yes" '.($this->Settings->allow_zone_removal === 'yes' ? 'selected' : '').'>'.__('yes', 'cloudflare').'</option>
38
          </select/><br><br>';
39
40
        return $html;
41
    }
42
43
    /** Get the DNS templates from the DNS platform
44
     *
45
     * @return array|bool
46
     */
47
    public function getDNSTemplates()
48
    {
49
        // if the DNS platform does not support DNS templates by it self, just do a:
50
        return false;
51
        // the WeFact Hosting user then has to create the DNS templates with each DNS record in WeFact Hosting
52
    }
53
54
    /** This function is called before a add/edit/show of a DNS integration
55
     *  For example, you can use this to encrypt a password.
56
     *
57
     * @param $edit_or_show
58
     * @param $settings
59
     *
60
     * @return mixed
61
     */
62
    public function processSettings($edit_or_show, $settings)
0 ignored issues
show
The parameter $edit_or_show is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

62
    public function processSettings(/** @scrutinizer ignore-unused */ $edit_or_show, $settings)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
63
    {
64
        return $settings;
65
    }
66
67
    /** Create a DNS zone with DNS records on the DNS platform
68
     *
69
     * @param $domain
70
     * @param $dns_zone
71
     *
72
     * @return bool
73
     */
74
    public function createDNSZone($domain, $dns_zone)
75
    {
76
        $cloudflare_connection = new CloudflareConnection($this->Settings->username, $this->Settings->api_key);
77
78
        $zone = $cloudflare_connection->createZone($domain, $this->Settings->account_id);
79
80
        if ($zone['success'] === true) {
81
            return $this->saveDNSZone($domain, $dns_zone);
82
        }
83
84
        return false;
85
    }
86
87
    /** This function will be called when a domain register, transfer or nameserver change has failed
88
     *  It can be used to revert any data that is set by the createDNSZone function (eg the creation of a DNS zone).
89
     *
90
     * @param $domain
91
     * @param $create_dns_zone_data
92
     *
93
     * @return bool
94
     */
95
    public function undoCreateDNSZone($domain, $create_dns_zone_data)
0 ignored issues
show
The parameter $domain is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

95
    public function undoCreateDNSZone(/** @scrutinizer ignore-unused */ $domain, $create_dns_zone_data)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
The parameter $create_dns_zone_data is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

95
    public function undoCreateDNSZone($domain, /** @scrutinizer ignore-unused */ $create_dns_zone_data)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
96
    {
97
        return false;
98
    }
99
100
    /** Retrieve the DNS zone with its DNS records from the DNS platform
101
     *
102
     * @param $domain
103
     *
104
     * @return array|bool
105
     */
106
    public function getDNSZone($domain)
107
    {
108
        $cloudflare_connection = new CloudflareConnection($this->Settings->username, $this->Settings->api_key);
109
        $zones = $cloudflare_connection->getZones(['name' => $domain]);
110
111
        if ($zones['success'] === true && count($zones['result']) === 1) {
112
            $zone = $zones['result'][0];
113
            $dns_records = $cloudflare_connection->getDnsRecordsForZone($zone['id'], []);
114
115
            if ($dns_records['success'] !== true) {
116
                return false;
117
            }
118
119
            $dns_zone = [];
120
            $i = 0;
121
            foreach ($dns_records['result'] as $record) {
122
                // if the record is not supported, it should be marked as readonly
123
                if (!in_array(strtoupper($record['type']), $this->SupportedRecordTypes, true)) {
124
                    $record_type = 'records_readonly';
125
                } else {
126
                    $record_type = 'records';
127
                }
128
129
                $dns_zone[$record_type][$i]['id'] = $record['id'];
130
                $dns_zone[$record_type][$i]['name'] = $record['name'];
131
                $dns_zone[$record_type][$i]['type'] = $record['type'];
132
                $dns_zone[$record_type][$i]['value'] = $record['content'];
133
                $dns_zone[$record_type][$i]['priority'] = $record['priority'] ?? '';
134
                $dns_zone[$record_type][$i]['ttl'] = $record['ttl'];
135
                $i++;
136
            }
137
138
            return $dns_zone;
139
        }
140
141
        return false;
142
    }
143
144
    /** Edit the DNS zone at the DNS platform
145
     *
146
     * @param $domain
147
     * @param $dns_zone
148
     *
149
     * @return bool
150
     */
151
    public function saveDNSZone($domain, $dns_zone)
152
    {
153
        if (isset($dns_zone['records']) && count($dns_zone['records']) > 0) {
154
            $cloudflare_connection = new CloudflareConnection($this->Settings->username, $this->Settings->api_key);
155
            $zones = $cloudflare_connection->getZones(['name' => $domain]);
156
157
            if ($zones['success'] === true && count($zones['result']) === 1) {
158
                $zone = $zones['result'][0];
159
                $dns_records = $cloudflare_connection->getDnsRecordsForZone($zone['id'], []);
160
161
                if ($dns_records['success'] !== true) {
162
                    return false;
163
                }
164
165
                $cf_record_ids = array_column($dns_records['result'], 'id');
166
                $updated_record_ids = array_column($dns_zone['records'], 'id');
167
                $deleted_record_ids = array_diff($cf_record_ids, $updated_record_ids);
168
169
                foreach ($deleted_record_ids as $id) {
170
                    $cloudflare_connection->deleteDnsRecord($zone['id'], $id);
171
                }
172
173
                foreach ($dns_zone['records'] as $record) {
174
                    $cf_record = [];
175
                    $cf_record['name'] = $record['name'];
176
                    $cf_record['type'] = $record['type'];
177
                    $cf_record['content'] = $record['value'];
178
                    $cf_record['ttl'] = $record['ttl'];
179
                    $cf_record['priority'] = trim($record['priority']) === '' ? 1 : $record['priority'];
180
181
                    if (isset($record['id'])) {
182
                        $cloudflare_connection->updateDnsRecord($zone['id'], $record['id'], $cf_record);
183
                    } else {
184
                        $cloudflare_connection->createDnsRecord($zone['id'], $cf_record);
185
                    }
186
                }
187
            }
188
        }
189
190
        return true;
191
    }
192
193
    /** This function is called when a domain is removed directly or by a termination procedure
194
     *
195
     * @param $domain
196
     *
197
     * @return bool
198
     */
199
    public function removeDNSZone($domain)
200
    {
201
        if ($this->Settings->allow_zone_removal === 'yes') {
202
            $cloudflare_connection = new CloudflareConnection($this->Settings->username, $this->Settings->api_key);
203
204
            $zones = $cloudflare_connection->getZones(['name' => $domain]);
205
206
            if ($zones['success'] === true && count($zones['result']) === 1) {
207
                $zone = $zones['result'][0];
208
                $zone_delete_result = $cloudflare_connection->deleteZone($zone['id']);
209
210
                return $zone_delete_result['success'];
211
            }
212
213
            return false;
214
        }
215
216
        return true;
217
    }
218
219
    /**
220
     * @param $language_code
221
     */
222
    public function loadLanguageArray($language_code)
223
    {
224
        $_LANG = [];
225
226
        switch ($language_code) {
227
            case 'nl_NL':
228
                $_LANG['dns templates could not be retrieved'] = 'De DNS templates konden niet worden opgehaald van het DNS platform of er zijn er geen aanwezig';
229
                $_LANG['username'] = 'Gebruikersnaam';
230
                $_LANG['api_key'] = 'API Key';
231
                $_LANG['account_id'] = 'Account ID';
232
                $_LANG['allow_zone_removal'] = 'DNS zone verwijderen bij verwijderen domein';
233
                $_LANG['yes'] = 'Ja';
234
                $_LANG['no'] = 'Nee';
235
            break;
236
237
            default: // In case of other language, use English
238
                $_LANG['dns templates could not be retrieved'] = 'DNS template could not be retrieved from the DNS platform or there were no DNS templates';
239
                $_LANG['username'] = 'Username';
240
                $_LANG['api_key'] = 'API Key';
241
                $_LANG['account_id'] = 'Account ID';
242
                $_LANG['allow_zone_removal'] = 'Remove DNS zone at domain deletion';
243
                $_LANG['yes'] = 'Ja';
244
                $_LANG['no'] = 'Nee';
245
            break;
246
        }
247
248
        // Save to global array
249
        global $_module_language_array;
250
        $_module_language_array['cloudflare'] = $_LANG;
251
    }
252
253
    /**
254
     * Use this function to prefix all errors messages with your VPS platform.
255
     *
256
     * @param string $message The error message
257
     *
258
     * @return bool Always false
259
     */
260
    private function __parseError($message)
261
    {
262
        $this->Error[] = 'Cloudflare: '.$message;
263
264
        return false;
265
    }
266
267
    /** This function is used to check if the login credentials for the DNS platform are correct
268
     *
269
     * @return bool
270
     */
271
    public function validateLogin()
272
    {
273
        $cloudflare_connection = new CloudflareConnection($this->Settings->username, $this->Settings->api_key);
274
275
        return $cloudflare_connection->validateLogin();
276
    }
277
}
278