Subversion Repositories oidplus

Rev

Rev 446 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
139 daniel-mar 1
<?php
2
 
3
/*
4
 * OIDplus 2.0
5
 * Copyright 2019 Daniel Marschall, ViaThinkSoft
6
 *
7
 * Licensed under the Apache License, Version 2.0 (the "License");
8
 * you may not use this file except in compliance with the License.
9
 * You may obtain a copy of the License at
10
 *
11
 *     http://www.apache.org/licenses/LICENSE-2.0
12
 *
13
 * Unless required by applicable law or agreed to in writing, software
14
 * distributed under the License is distributed on an "AS IS" BASIS,
15
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
 * See the License for the specific language governing permissions and
17
 * limitations under the License.
18
 */
19
 
256 daniel-mar 20
class OIDplusPageAdminRegistration extends OIDplusPagePluginAdmin {
139 daniel-mar 21
 
269 daniel-mar 22
        /*private*/ const QUERY_REGISTER_V1 =         '1.3.6.1.4.1.37476.2.5.2.1.1.1';
23
        /*private*/ const QUERY_UNREGISTER_V1 =       '1.3.6.1.4.1.37476.2.5.2.1.2.1';
24
        /*private*/ const QUERY_LISTALLSYSTEMIDS_V1 = '1.3.6.1.4.1.37476.2.5.2.1.3.1';
25
        /*private*/ const QUERY_LIVESTATUS_V1 =       '1.3.6.1.4.1.37476.2.5.2.1.4.1';
256 daniel-mar 26
 
139 daniel-mar 27
        public function gui($id, &$out, &$handled) {
141 daniel-mar 28
                if ($id === 'oidplus:srv_registration') {
139 daniel-mar 29
                        $handled = true;
360 daniel-mar 30
                        $out['title'] = _L('System registration settings');
241 daniel-mar 31
                        $out['icon'] = file_exists(__DIR__.'/icon_big.png') ? OIDplus::webpath(__DIR__).'icon_big.png' : '';
139 daniel-mar 32
 
33
                        if (!OIDplus::authUtils()::isAdminLoggedIn()) {
34
                                $out['icon'] = 'img/error_big.png';
360 daniel-mar 35
                                $out['text'] = '<p>'._L('You need to <a %1>log in</a> as administrator.',OIDplus::gui()->link('oidplus:login')).'</p>';
281 daniel-mar 36
                                return;
37
                        }
38
 
362 daniel-mar 39
                        if (file_exists(__DIR__ . '/info$'.OIDplus::getCurrentLang().'.html')) {
40
                                $info = file_get_contents(__DIR__ . '/info$'.OIDplus::getCurrentLang().'.html');
41
                        } else {
42
                                $info = file_get_contents(__DIR__ . '/info.html');
43
                        }
395 daniel-mar 44
 
386 daniel-mar 45
                        list($html, $js, $css) = extractHtmlContents($info);
46
                        $info = '';
47
                        if (!empty($js))  $info .= "<script>\n$js\n</script>";
48
                        if (!empty($css)) $info .= "<style>\n$css\n</style>";
49
                        $info .= $html;
281 daniel-mar 50
 
362 daniel-mar 51
                        $out['text'] = $info;
52
 
281 daniel-mar 53
                        if (!OIDplus::getPkiStatus()) {
360 daniel-mar 54
                                $out['text'] .= '<p><font color="red">'._L('Error: Your system could not generate a private/public key pair. (OpenSSL is probably missing on your system). Therefore, you cannot register/unregister your OIDplus instance.').'</font></p>';
139 daniel-mar 55
                        } else {
360 daniel-mar 56
                                $out['text'] .= '<p><input type="button" onclick="openOidInPanel(\'oidplus:srvreg_status\');" value="'._L('Check status of the registration and collected data').'"></p>';
277 daniel-mar 57
 
281 daniel-mar 58
                                if (OIDplus::baseConfig()->getValue('REGISTRATION_HIDE_SYSTEM', false)) {
360 daniel-mar 59
                                        $out['text'] .= '<p><font color="red"><b>'._L('Attention!').'</b> '._L('<code>REGISTRATION_HIDE_SYSTEM</code> is set in the local configuration file! Therefore, this system will not register itself, despite of the settings below.').'</font></p>';
281 daniel-mar 60
                                }
139 daniel-mar 61
 
360 daniel-mar 62
                                $out['text'] .= '<p>'._L('You can adjust your privacy level here').':</p><p><select name="reg_privacy" id="reg_privacy">';
227 daniel-mar 63
 
281 daniel-mar 64
                                # ---
139 daniel-mar 65
 
281 daniel-mar 66
                                $out['text'] .= '<option value="0"';
67
                                if (OIDplus::config()->getValue('reg_privacy') == 0) {
68
                                        $out['text'] .= ' selected';
69
                                } else {
70
                                        $out['text'] .= '';
71
                                }
360 daniel-mar 72
                                $out['text'] .= '>'._L('0 = Register to directory service and automatically publish RA/OID data at oid-info.com').'</option>';
139 daniel-mar 73
 
281 daniel-mar 74
                                # ---
139 daniel-mar 75
 
281 daniel-mar 76
                                $out['text'] .= '<option value="1"';
77
                                if (OIDplus::config()->getValue('reg_privacy') == 1) {
78
                                        $out['text'] .= ' selected';
79
                                } else {
80
                                        $out['text'] .= '';
81
                                }
360 daniel-mar 82
                                $out['text'] .= '>'._L('1 = Only register to directory service').'</option>';
139 daniel-mar 83
 
281 daniel-mar 84
                                # ---
139 daniel-mar 85
 
281 daniel-mar 86
                                $out['text'] .= '<option value="2"';
87
                                if (OIDplus::config()->getValue('reg_privacy') == 2) {
88
                                        $out['text'] .= ' selected';
89
                                } else {
90
                                        $out['text'] .= '';
91
                                }
360 daniel-mar 92
                                $out['text'] .= '>'._L('2 = Hide system').'</option>';
139 daniel-mar 93
 
281 daniel-mar 94
                                # ---
139 daniel-mar 95
 
360 daniel-mar 96
                                $out['text'] .= '</select> <input type="button" value="'._L('Change').'" onclick="crudActionRegPrivacyUpdate()"></p>';
139 daniel-mar 97
 
360 daniel-mar 98
                                $out['text'] .= '<p>'._L('After clicking "change", your OIDplus system will contact the ViaThinkSoft server to adjust (add or remove information) your privacy setting. This may take a few minutes.').'</p>';
139 daniel-mar 99
 
360 daniel-mar 100
                                $out['text'] .= '<p>'._L('<i>Privacy information:</i> Please note that removing your system from the directory does not automatically delete information about OIDs which are already published at oid-info.com. To remove already submitted OIDs at oid-info.com, please contact the <a href="mailto:admin@oid-info.com">OID Repository Webmaster</a>.').'</p>';
139 daniel-mar 101
                        }
102
                }
141 daniel-mar 103
                if ($id === 'oidplus:srvreg_status') {
104
                        $handled = true;
446 daniel-mar 105
                        $out['title'] = _L('Registration live status');
106
                        $out['icon'] = file_exists(__DIR__.'/icon_big.png') ? OIDplus::webpath(__DIR__).'icon_big.png' : '';
141 daniel-mar 107
 
446 daniel-mar 108
                        if (!OIDplus::authUtils()::isAdminLoggedIn()) {
109
                                $out['icon'] = 'img/error_big.png';
110
                                $out['text'] = '<p>'._L('You need to <a %1>log in</a> as administrator.',OIDplus::gui()->link('oidplus:login')).'</p>';
111
                                return;
112
                        }
113
 
256 daniel-mar 114
                        $query = self::QUERY_LIVESTATUS_V1;
141 daniel-mar 115
 
116
                        $payload = array(
117
                                "query" => $query, // we must repeat the query because we want to sign it
446 daniel-mar 118
                                "lang" => OIDplus::getCurrentLang(),
227 daniel-mar 119
                                "system_id" => OIDplus::getSystemId(false)
141 daniel-mar 120
                        );
121
 
122
                        $signature = '';
239 daniel-mar 123
                        if (!@openssl_sign(json_encode($payload), $signature, OIDplus::config()->getValue('oidplus_private_key'))) {
360 daniel-mar 124
                                throw new OIDplusException(_L('Signature failed'));
239 daniel-mar 125
                        }
141 daniel-mar 126
 
127
                        $data = array(
128
                                "payload" => $payload,
129
                                "signature" => base64_encode($signature)
130
                        );
131
 
463 daniel-mar 132
                        if (!function_exists('curl_exec')) {
133
                                throw new Exception(_L('The "CURL" PHP extension is not installed at your system. Please enable the PHP extension <code>php_curl</code>.'));
134
                        }
135
 
141 daniel-mar 136
                        $ch = curl_init();
137
                        curl_setopt($ch, CURLOPT_URL, 'https://oidplus.viathinksoft.com/reg2/query.php');
138
                        curl_setopt($ch, CURLOPT_POST, 1);
413 daniel-mar 139
                        curl_setopt($ch, CURLOPT_POSTFIELDS, "query=".urlencode($query)."&compressed=1&data=".urlencode(base64_encode(gzdeflate(json_encode($data)))));
141 daniel-mar 140
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
141
                        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
142
                        curl_setopt($ch, CURLOPT_AUTOREFERER, true);
239 daniel-mar 143
                        if (!($res = @curl_exec($ch))) {
360 daniel-mar 144
                                throw new OIDplusException(_L('Communication with ViaThinkSoft server failed: %1',curl_error($ch)));
239 daniel-mar 145
                        }
141 daniel-mar 146
                        curl_close($ch);
147
 
370 daniel-mar 148
                        $json = @json_decode($res, true);
149
 
150
                        if (!$json) {
151
                                $out['icon'] = 'img/error_big.png';
152
                                $out['text'] = _L('JSON reply from ViaThinkSoft decoding error: %1',$res);
153
                                return;
154
                        }
155
 
381 daniel-mar 156
                        if (isset($json['error']) || ($json['status'] < 0)) {
370 daniel-mar 157
                                $out['icon'] = 'img/error_big.png';
158
                                if (isset($json['error'])) {
159
                                        $out['text'] = _L('Received error status code: %1',$json['error']);
160
                                } else {
161
                                        $out['text'] = _L('Received error status code: %1',$json['status']);
162
                                }
163
                                return;
164
                        }
165
 
366 daniel-mar 166
                        $out['text']  = '<p><a '.OIDplus::gui()->link('oidplus:srv_registration').'><img src="img/arrow_back.png" width="16" alt="'._L('Go back').'"> '._L('Go back to registration settings').'</a></p>' .
372 daniel-mar 167
                                        $json['content'];
141 daniel-mar 168
                }
139 daniel-mar 169
        }
170
 
370 daniel-mar 171
        protected function areWeRegistered() {
172
                // To check if we are registered. Check it "anonymously" (i.e. without revealing our system ID)
173
                $res = file_get_contents('https://oidplus.viathinksoft.com/reg2/query.php?query='.self::QUERY_LISTALLSYSTEMIDS_V1);
174
 
175
                $json = @json_decode($res, true);
176
 
177
                if (!$json) {
178
                        return false; // throw new OIDplusException(_L('JSON reply from ViaThinkSoft decoding error: %1',$res));
179
                }
180
 
381 daniel-mar 181
                if (isset($json['error']) || ($json['status'] < 0)) {
370 daniel-mar 182
                        if (isset($json['error'])) {
183
                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['error']));
184
                        } else {
185
                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['status']));
186
                        }
187
                }
188
 
189
                $list = $json['list'];
190
 
191
                return in_array(OIDplus::getSystemId(false), $list);
192
        }
193
 
140 daniel-mar 194
        public function sendRegistrationQuery($privacy_level=null) {
195
                if (is_null($privacy_level)) {
196
                        $privacy_level = OIDplus::config()->getValue('reg_privacy');
197
                }
139 daniel-mar 198
 
227 daniel-mar 199
                $system_url = OIDplus::getSystemUrl();
139 daniel-mar 200
 
175 daniel-mar 201
                // It is very important that we set the ping time NOW, because ViaThinkSoft might contact us during the ping,
202
                // and this would cause an endless loop!
203
                OIDplus::config()->setValue('reg_last_ping', time());
277 daniel-mar 204
 
239 daniel-mar 205
                if (!OIDplus::getPkiStatus()) return false;
175 daniel-mar 206
 
139 daniel-mar 207
                if ($privacy_level == 2) {
370 daniel-mar 208
                        // The user wants to unregister,  but we only unregister if we are registered
209
                        if ($this->areWeRegistered()) {
256 daniel-mar 210
                                $query = self::QUERY_UNREGISTER_V1;
139 daniel-mar 211
 
212
                                $payload = array(
213
                                        "query" => $query, // we must repeat the query because we want to sign it
227 daniel-mar 214
                                        "system_id" => OIDplus::getSystemId(false)
139 daniel-mar 215
                                );
216
 
217
                                $signature = '';
239 daniel-mar 218
                                if (!@openssl_sign(json_encode($payload), $signature, OIDplus::config()->getValue('oidplus_private_key'))) {
360 daniel-mar 219
                                        return false; // throw new OIDplusException(_L('Signature failed'));
239 daniel-mar 220
                                }
139 daniel-mar 221
 
222
                                $data = array(
223
                                        "payload" => $payload,
224
                                        "signature" => base64_encode($signature)
225
                                );
226
 
463 daniel-mar 227
                                if (!function_exists('curl_exec')) {
228
                                        return false; // throw new Exception(_L('The "CURL" PHP extension is not installed at your system. Please enable the PHP extension <code>php_curl</code>.'));
229
                                }
230
 
139 daniel-mar 231
                                $ch = curl_init();
232
                                curl_setopt($ch, CURLOPT_URL, 'https://oidplus.viathinksoft.com/reg2/query.php');
233
                                curl_setopt($ch, CURLOPT_POST, 1);
413 daniel-mar 234
                                curl_setopt($ch, CURLOPT_POSTFIELDS, "query=".urlencode($query)."&compressed=1&data=".urlencode(base64_encode(gzdeflate(json_encode($data)))));
139 daniel-mar 235
                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
236
                                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
237
                                curl_setopt($ch, CURLOPT_AUTOREFERER, true);
239 daniel-mar 238
                                if (!($res = @curl_exec($ch))) {
360 daniel-mar 239
                                        return false; // throw new OIDplusException(_L('Communication with ViaThinkSoft server failed: %1',curl_error($ch)));
239 daniel-mar 240
                                }
139 daniel-mar 241
                                curl_close($ch);
370 daniel-mar 242
 
243
                                $json = @json_decode($res, true);
244
 
245
                                if (!$json) {
246
                                        return false; // throw new OIDplusException(_L('JSON reply from ViaThinkSoft decoding error: %1',$res));
247
                                }
248
 
381 daniel-mar 249
                                if (isset($json['error']) || ($json['status'] < 0)) {
370 daniel-mar 250
                                        if (isset($json['error'])) {
251
                                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['error']));
252
                                        } else {
253
                                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['status']));
254
                                        }
255
                                }
139 daniel-mar 256
                        }
257
                } else {
258
                        if ($privacy_level == 0) {
380 daniel-mar 259
                                $adminExportPlugin = OIDplus::getPluginByOid('1.3.6.1.4.1.37476.2.5.2.4.3.400'); // OIDplusPageAdminOIDInfoExport
260
                                if (!is_null($adminExportPlugin)) {
139 daniel-mar 261
                                        ob_start();
262
                                        OIDplusPageAdminOIDInfoExport::outputXML(false); // no online check, because the query should be short (since the query is done while a visitor waits for the response)
263
                                        $oidinfo_xml = ob_get_contents();
264
                                        ob_end_clean();
265
                                } else {
266
                                        $oidinfo_xml = false;
267
                                }
268
                        } else {
269
                                $oidinfo_xml = false;
270
                        }
271
 
256 daniel-mar 272
                        $query = self::QUERY_REGISTER_V1;
139 daniel-mar 273
 
274
                        $root_oids = array();
227 daniel-mar 275
                        foreach (OIDplus::getEnabledObjectTypes() as $ot) {
139 daniel-mar 276
                                if ($ot::ns() == 'oid') {
261 daniel-mar 277
                                        $res = OIDplus::db()->query("select id from ###objects where " .
396 daniel-mar 278
                                                                    "(parent = 'oid:' or " .
394 daniel-mar 279
                                                                    // The following two cases are special cases e.g. if there are multiple PEN or UUID-OIDs, and the system owner decides to use the IANA PEN as root OID, but actually, it is not "his" root then! The OIDs inside the IANA PEN root are his root then!
443 daniel-mar 280
                                                                    "parent in (select oid from ###asn1id where well_known = ?) or " .
281
                                                                    "parent in (select oid from ###iri where well_known = ?)) and " .
396 daniel-mar 282
                                                                    // We assume hereby that RAs of well-known OIDs (e.g. IANA) will not use OIDplus for allocating OIDs:
443 daniel-mar 283
                                                                    "id not in (select oid from ###asn1id where well_known = ?) and " .
284
                                                                    "id not in (select oid from ###iri where well_known = ?) " .
285
                                                                    "order by ".OIDplus::db()->natOrder('id'), array(true, true, true, true));
236 daniel-mar 286
                                        while ($row = $res->fetch_array()) {
139 daniel-mar 287
                                                $root_oids[] = substr($row['id'],strlen('oid:'));
288
                                        }
289
                                }
290
                        }
291
                        $payload = array(
292
                                "query" => $query, // we must repeat the query because we want to sign it
293
                                "privacy_level" => $privacy_level,
227 daniel-mar 294
                                "system_id" => OIDplus::getSystemId(false),
139 daniel-mar 295
                                "public_key" => OIDplus::config()->getValue('oidplus_public_key'),
296
                                "system_url" => $system_url,
297
                                "hide_system_url" => 0,
298
                                "hide_public_key" => 0,
299
                                "admin_email" => OIDplus::config()->getValue('admin_email'),
257 daniel-mar 300
                                "system_title" => OIDplus::config()->getValue('system_title'),
139 daniel-mar 301
                                "oidinfo_xml" => @base64_encode($oidinfo_xml),
170 daniel-mar 302
                                "root_oids" => $root_oids,
303
                                "system_version" => OIDplus::getVersion(),
304
                                "system_install_type" => OIDplus::getInstallType()
139 daniel-mar 305
                        );
306
 
307
                        $signature = '';
239 daniel-mar 308
                        if (!@openssl_sign(json_encode($payload), $signature, OIDplus::config()->getValue('oidplus_private_key'))) {
396 daniel-mar 309
                                return false; // throw new OIDplusException(_L('Signature failed'));
239 daniel-mar 310
                        }
139 daniel-mar 311
 
312
                        $data = array(
313
                                "payload" => $payload,
314
                                "signature" => base64_encode($signature)
315
                        );
316
 
463 daniel-mar 317
 
318
                        if (!function_exists('curl_exec')) {
319
                                return false; // throw new Exception(_L('The "CURL" PHP extension is not installed at your system. Please enable the PHP extension <code>php_curl</code>.'));
320
                        }
321
 
139 daniel-mar 322
                        $ch = curl_init();
323
                        curl_setopt($ch, CURLOPT_URL, 'https://oidplus.viathinksoft.com/reg2/query.php');
324
                        curl_setopt($ch, CURLOPT_POST, 1);
413 daniel-mar 325
                        curl_setopt($ch, CURLOPT_POSTFIELDS, "query=".urlencode($query)."&compressed=1&data=".urlencode(base64_encode(gzdeflate(json_encode($data)))));
139 daniel-mar 326
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
327
                        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
328
                        curl_setopt($ch, CURLOPT_AUTOREFERER, true);
239 daniel-mar 329
                        if (!($res = @curl_exec($ch))) {
360 daniel-mar 330
                                return false; // throw new OIDplusException(_L('Communication with ViaThinkSoft server failed: %1',curl_error($ch)));
239 daniel-mar 331
                        }
139 daniel-mar 332
                        curl_close($ch);
206 daniel-mar 333
 
370 daniel-mar 334
                        $json = @json_decode($res, true);
335
 
336
                        if (!$json) {
337
                                return false; // throw new OIDplusException(_L('JSON reply from ViaThinkSoft decoding error: %1',$res));
338
                        }
339
 
381 daniel-mar 340
                        if (isset($json['error']) || ($json['status'] < 0)) {
341
                                if (isset($json['error'])) {
342
                                        return false; // throw new OIDplusException(_L('Received error status code: %1',$json['error']));
343
                                } else {
344
                                        return false; // throw new OIDplusException(_L('Received error status code: %1',$json['status']));
345
                                }
346
                        } else if ($json['status'] == 99/*Hash conflict*/) {
288 daniel-mar 347
                                OIDplus::logger()->log("[WARN]A!", "Removing SystemID and key pair because there is a hash conflict with another OIDplus system!");
206 daniel-mar 348
 
349
                                // Delete the system ID since we have a conflict with the 31-bit hash!
350
                                OIDplus::config()->setValue('oidplus_private_key', '');
351
                                OIDplus::config()->setValue('oidplus_public_key', '');
352
 
353
                                // Try to generate a new system ID
227 daniel-mar 354
                                OIDplus::getPkiStatus(true);
206 daniel-mar 355
 
370 daniel-mar 356
                                // Enforce a new registration attempt at the next page visit
206 daniel-mar 357
                                // We will not try again here, because that might lead to an endless loop if the VTS server would always return 'HASH_CONFLCIT'
358
                                OIDplus::config()->setValue('reg_last_ping', 0);
359
                        }
139 daniel-mar 360
                }
361
        }
362
 
363
        public function init($html=true) {
463 daniel-mar 364
                // Note: It is important that the default value is '2', otherwise, systems which don't have CURL will fail
365
                OIDplus::config()->prepareConfigKey('reg_privacy', '2=Hide your system, 1=Register your system to the ViaThinkSoft directory and oid-info.com, 0=Publish your system to ViaThinkSoft directory and all public contents (RA/OID) to oid-info.com', '2', OIDplusConfig::PROTECTION_EDITABLE, function($value) {
263 daniel-mar 366
                        if (($value != '0') && ($value != '1') && ($value != '2')) {
360 daniel-mar 367
                                throw new OIDplusException(_L('Please enter either 0, 1 or 2.'));
263 daniel-mar 368
                        }
369
                        // Now do a recheck and notify the ViaThinkSoft server
316 daniel-mar 370
                        if (($value == 2) || !OIDplus::baseConfig()->getValue('REGISTRATION_HIDE_SYSTEM', false)) {
371
                                OIDplus::config()->setValue('reg_last_ping', 0);
372
                                $this->sendRegistrationQuery($value);
373
                        }
263 daniel-mar 374
                });
375
                OIDplus::config()->prepareConfigKey('reg_ping_interval', 'Registration ping interval (in seconds)', '3600', OIDplusConfig::PROTECTION_HIDDEN, function($value) {
277 daniel-mar 376
 
263 daniel-mar 377
                });
378
                OIDplus::config()->prepareConfigKey('reg_last_ping', 'Last ping to ViaThinkSoft directory services', '0', OIDplusConfig::PROTECTION_HIDDEN, function($value) {
277 daniel-mar 379
 
263 daniel-mar 380
                });
362 daniel-mar 381
                OIDplus::config()->prepareConfigKey('oobe_registration_done', '"Out Of Box Experience" wizard for OIDplusPageAdminRegistration done once?', '0', OIDplusConfig::PROTECTION_HIDDEN, function($value) {});
277 daniel-mar 382
 
292 daniel-mar 383
                // Is it time to register / renew the directory entry?
294 daniel-mar 384
                // Note: REGISTRATION_HIDE_SYSTEM is an undocumented constant that can be put in the userdata/baseconfig/config.inc.php files of a test system accessing the same database as the productive system that is registered.
292 daniel-mar 385
                // This avoids that the URL of a productive system is overridden with the URL of a cloned test system (since they use the same database, they also have the same system ID)
277 daniel-mar 386
 
463 daniel-mar 387
                if (OIDplus::config()->getValue('oobe_registration_done') == '1') {
388
                        if (!OIDplus::baseConfig()->getValue('REGISTRATION_HIDE_SYSTEM', false)) {
389
                                $privacy_level = OIDplus::config()->getValue('reg_privacy');
139 daniel-mar 390
 
463 daniel-mar 391
                                if (PHP_SAPI !== 'cli') { // don't register when called from CLI, otherwise the oidinfo XML can't convert relative links into absolute links
392
                                        if ((time()-OIDplus::config()->getValue('reg_last_ping') >= OIDplus::config()->getValue('reg_ping_interval'))) {
393
                                                $this->sendRegistrationQuery();
394
                                        }
139 daniel-mar 395
                                }
396
                        }
397
                }
398
        }
399
 
400
        public function tree(&$json, $ra_email=null, $nonjs=false, $req_goto='') {
281 daniel-mar 401
                if (!OIDplus::authUtils()::isAdminLoggedIn()) return false;
292 daniel-mar 402
 
139 daniel-mar 403
                if (file_exists(__DIR__.'/treeicon.png')) {
241 daniel-mar 404
                        $tree_icon = OIDplus::webpath(__DIR__).'treeicon.png';
139 daniel-mar 405
                } else {
406
                        $tree_icon = null; // default icon (folder)
407
                }
408
 
409
                $json[] = array(
141 daniel-mar 410
                        'id' => 'oidplus:srv_registration',
139 daniel-mar 411
                        'icon' => $tree_icon,
360 daniel-mar 412
                        'text' => _L('System registration')
139 daniel-mar 413
                );
414
 
415
                return true;
416
        }
417
 
418
        public function tree_search($request) {
419
                return false;
420
        }
292 daniel-mar 421
 
422
        public function implementsFeature($id) {
370 daniel-mar 423
                if (strtolower($id) == '1.3.6.1.4.1.37476.2.5.2.3.1') return true; // oobeEntry, oobeRequested
292 daniel-mar 424
                return false;
425
        }
426
 
362 daniel-mar 427
        public function oobeRequested(): bool {
428
                // Interface 1.3.6.1.4.1.37476.2.5.2.3.1
370 daniel-mar 429
 
362 daniel-mar 430
                return OIDplus::config()->getValue('oobe_registration_done') == '0';
431
        }
432
 
292 daniel-mar 433
        public function oobeEntry($step, $do_edits, &$errors_happened)/*: void*/ {
434
                // Interface 1.3.6.1.4.1.37476.2.5.2.3.1
435
 
360 daniel-mar 436
                echo '<p><u>'._L('Step %1: System registration and automatic publishing (optional)',$step).'</u></p>';
370 daniel-mar 437
 
362 daniel-mar 438
                if (file_exists(__DIR__ . '/info$'.OIDplus::getCurrentLang().'.html')) {
439
                        $info = file_get_contents(__DIR__ . '/info$'.OIDplus::getCurrentLang().'.html');
440
                } else {
441
                        $info = file_get_contents(__DIR__ . '/info.html');
442
                }
292 daniel-mar 443
 
362 daniel-mar 444
                // make sure the program works even if the user provided HTML is not UTF-8
445
                $info = iconv(mb_detect_encoding($info, mb_detect_order(), true), 'UTF-8//IGNORE', $info);
446
                $bom = pack('H*','EFBBBF');
447
                $info = preg_replace("/^$bom/", '', $info);
292 daniel-mar 448
 
362 daniel-mar 449
                echo $info;
450
 
353 daniel-mar 451
                if (!function_exists('curl_exec')) {
360 daniel-mar 452
                        echo '<p><font color="red">';
463 daniel-mar 453
                        echo _L('The "CURL" PHP extension is not installed at your system. Please enable the PHP extension <code>php_curl</code>.').' ';
360 daniel-mar 454
                        echo _L('Therefore, you <b>cannot</b> register your OIDplus instance now.');
455
                        echo '</font></p>';
362 daniel-mar 456
                        if ($do_edits) {
457
                                OIDplus::config()->setValue('oobe_registration_done', '1');
458
                        }
353 daniel-mar 459
                        return;
460
                }
461
 
462
                $testurl = 'https://www.google.com/';
463
                $ch = curl_init();
464
                curl_setopt($ch, CURLOPT_URL, $testurl);
465
                curl_setopt($ch, CURLOPT_HEADER, TRUE);
466
                curl_setopt($ch, CURLOPT_NOBODY, TRUE);
467
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
468
                curl_exec($ch);
469
                $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
470
                curl_close($ch);
471
                if (!$httpCode) {
360 daniel-mar 472
                        echo '<p><font color="red">';
463 daniel-mar 473
                        echo _L('The "CURL" PHP extension cannot access HTTPS webpages. Therefore, you cannot use this feature. Please download <a href="https://curl.haxx.se/ca/cacert.pem">cacert.pem</a>, place it somewhere and then adjust the setting <code>curl.cainfo</code> in PHP.ini.').' ';
360 daniel-mar 474
                        echo _L('Therefore, you <b>cannot</b> register your OIDplus instance now.');
475
                        echo '</font></p>';
362 daniel-mar 476
                        if ($do_edits) {
477
                                OIDplus::config()->setValue('oobe_registration_done', '1');
478
                        }
353 daniel-mar 479
                        return;
480
                }
481
 
292 daniel-mar 482
                $pki_status = OIDplus::getPkiStatus();
483
 
484
                if (!$pki_status) {
360 daniel-mar 485
                        echo '<p><font color="red">';
463 daniel-mar 486
                        echo _L('Your system could not generate a private/public key pair. (OpenSSL is probably missing on your system).').' ';
360 daniel-mar 487
                        echo _L('Therefore, you <b>cannot</b> register your OIDplus instance now.');
488
                        echo '</font></p>';
362 daniel-mar 489
                        if ($do_edits) {
490
                                OIDplus::config()->setValue('oobe_registration_done', '1');
491
                        }
353 daniel-mar 492
                        return;
493
                }
292 daniel-mar 494
 
360 daniel-mar 495
                echo '<p>'._L('Privacy level').':</p><select name="reg_privacy" id="reg_privacy">';
292 daniel-mar 496
 
353 daniel-mar 497
                # ---
292 daniel-mar 498
 
353 daniel-mar 499
                echo '<option value="0"';
500
                if (isset($_REQUEST['sent'])) {
501
                        if (isset($_REQUEST['reg_privacy']) && ($_REQUEST['reg_privacy'] == 0)) echo ' selected';
502
                } else {
362 daniel-mar 503
                        if ((OIDplus::config()->getValue('reg_privacy') == 0) || !OIDplus::config()->getValue('oobe_registration_done')) {
353 daniel-mar 504
                                echo ' selected';
292 daniel-mar 505
                        } else {
353 daniel-mar 506
                                echo '';
292 daniel-mar 507
                        }
353 daniel-mar 508
                }
360 daniel-mar 509
                echo '>'._L('0 = Register to directory service and automatically publish RA/OID data at oid-info.com').'</option>';
292 daniel-mar 510
 
353 daniel-mar 511
                # ---
292 daniel-mar 512
 
353 daniel-mar 513
                echo '<option value="1"';
514
                if (isset($_REQUEST['sent'])) {
515
                        if (isset($_REQUEST['reg_privacy']) && ($_REQUEST['reg_privacy'] == 1)) echo ' selected';
516
                } else {
517
                        if ((OIDplus::config()->getValue('reg_privacy') == 1)) {
518
                                echo ' selected';
292 daniel-mar 519
                        } else {
353 daniel-mar 520
                                echo '';
292 daniel-mar 521
                        }
353 daniel-mar 522
                }
360 daniel-mar 523
                echo '>'._L('1 = Only register to directory service').'</option>';
292 daniel-mar 524
 
353 daniel-mar 525
                # ---
292 daniel-mar 526
 
353 daniel-mar 527
                echo '<option value="2"';
528
                if (isset($_REQUEST['sent'])) {
529
                        if (isset($_REQUEST['reg_privacy']) && ($_REQUEST['reg_privacy'] == 2)) echo ' selected';
530
                } else {
531
                        if ((OIDplus::config()->getValue('reg_privacy') == 2)) {
532
                                echo ' selected';
292 daniel-mar 533
                        } else {
353 daniel-mar 534
                                echo '';
292 daniel-mar 535
                        }
353 daniel-mar 536
                }
360 daniel-mar 537
                echo '>'._L('2 = Hide system').'</option>';
292 daniel-mar 538
 
353 daniel-mar 539
                # ---
292 daniel-mar 540
 
353 daniel-mar 541
                echo '</select>';
292 daniel-mar 542
 
353 daniel-mar 543
                $msg = '';
544
                if ($do_edits) {
545
                        try {
546
                                OIDplus::config()->setValue('reg_privacy', $_REQUEST['reg_privacy']);
362 daniel-mar 547
                                OIDplus::config()->setValue('oobe_registration_done', '1');
353 daniel-mar 548
                        } catch (Exception $e) {
549
                                $msg = $e->getMessage();
550
                                $errors_happened = true;
292 daniel-mar 551
                        }
353 daniel-mar 552
                }
553
                echo ' <font color="red"><b>'.$msg.'</b></font>';
292 daniel-mar 554
 
360 daniel-mar 555
                echo '<p>'._L('<i>Privacy information:</i> This setting can always be changed in the administrator login / control panel.').'<br>';
556
                echo _L('<a %1>Click here</a> for more information about privacy related topics.','href="../../../res/OIDplus/privacy_documentation.html" target="_blank"');
557
                echo '</p>';
292 daniel-mar 558
        }
559
 
463 daniel-mar 560
}