Subversion Repositories oidplus

Rev

Rev 394 | 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;
105
 
256 daniel-mar 106
                        $query = self::QUERY_LIVESTATUS_V1;
141 daniel-mar 107
 
108
                        $payload = array(
109
                                "query" => $query, // we must repeat the query because we want to sign it
227 daniel-mar 110
                                "system_id" => OIDplus::getSystemId(false)
141 daniel-mar 111
                        );
112
 
113
                        $signature = '';
239 daniel-mar 114
                        if (!@openssl_sign(json_encode($payload), $signature, OIDplus::config()->getValue('oidplus_private_key'))) {
360 daniel-mar 115
                                throw new OIDplusException(_L('Signature failed'));
239 daniel-mar 116
                        }
141 daniel-mar 117
 
118
                        $data = array(
119
                                "payload" => $payload,
120
                                "signature" => base64_encode($signature)
121
                        );
122
 
123
                        $ch = curl_init();
124
                        curl_setopt($ch, CURLOPT_URL, 'https://oidplus.viathinksoft.com/reg2/query.php');
125
                        curl_setopt($ch, CURLOPT_POST, 1);
126
                        curl_setopt($ch, CURLOPT_POSTFIELDS, "query=$query&data=".base64_encode(json_encode($data)));
127
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
128
                        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
129
                        curl_setopt($ch, CURLOPT_AUTOREFERER, true);
239 daniel-mar 130
                        if (!($res = @curl_exec($ch))) {
360 daniel-mar 131
                                throw new OIDplusException(_L('Communication with ViaThinkSoft server failed: %1',curl_error($ch)));
239 daniel-mar 132
                        }
141 daniel-mar 133
                        curl_close($ch);
134
 
370 daniel-mar 135
                        $json = @json_decode($res, true);
136
 
137
                        if (!$json) {
138
                                $out['icon'] = 'img/error_big.png';
139
                                $out['text'] = _L('JSON reply from ViaThinkSoft decoding error: %1',$res);
140
                                return;
141
                        }
142
 
381 daniel-mar 143
                        if (isset($json['error']) || ($json['status'] < 0)) {
370 daniel-mar 144
                                $out['icon'] = 'img/error_big.png';
145
                                if (isset($json['error'])) {
146
                                        $out['text'] = _L('Received error status code: %1',$json['error']);
147
                                } else {
148
                                        $out['text'] = _L('Received error status code: %1',$json['status']);
149
                                }
150
                                return;
151
                        }
152
 
360 daniel-mar 153
                        $out['title'] = _L('Registration live status');
366 daniel-mar 154
                        $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 155
                                        $json['content'];
141 daniel-mar 156
                }
139 daniel-mar 157
        }
158
 
370 daniel-mar 159
        protected function areWeRegistered() {
160
                // To check if we are registered. Check it "anonymously" (i.e. without revealing our system ID)
161
                $res = file_get_contents('https://oidplus.viathinksoft.com/reg2/query.php?query='.self::QUERY_LISTALLSYSTEMIDS_V1);
162
 
163
                $json = @json_decode($res, true);
164
 
165
                if (!$json) {
166
                        return false; // throw new OIDplusException(_L('JSON reply from ViaThinkSoft decoding error: %1',$res));
167
                }
168
 
381 daniel-mar 169
                if (isset($json['error']) || ($json['status'] < 0)) {
370 daniel-mar 170
                        if (isset($json['error'])) {
171
                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['error']));
172
                        } else {
173
                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['status']));
174
                        }
175
                }
176
 
177
                $list = $json['list'];
178
 
179
                return in_array(OIDplus::getSystemId(false), $list);
180
        }
181
 
140 daniel-mar 182
        public function sendRegistrationQuery($privacy_level=null) {
183
                if (is_null($privacy_level)) {
184
                        $privacy_level = OIDplus::config()->getValue('reg_privacy');
185
                }
139 daniel-mar 186
 
227 daniel-mar 187
                $system_url = OIDplus::getSystemUrl();
139 daniel-mar 188
 
175 daniel-mar 189
                // It is very important that we set the ping time NOW, because ViaThinkSoft might contact us during the ping,
190
                // and this would cause an endless loop!
191
                OIDplus::config()->setValue('reg_last_ping', time());
277 daniel-mar 192
 
239 daniel-mar 193
                if (!OIDplus::getPkiStatus()) return false;
175 daniel-mar 194
 
139 daniel-mar 195
                if ($privacy_level == 2) {
370 daniel-mar 196
                        // The user wants to unregister,  but we only unregister if we are registered
197
                        if ($this->areWeRegistered()) {
256 daniel-mar 198
                                $query = self::QUERY_UNREGISTER_V1;
139 daniel-mar 199
 
200
                                $payload = array(
201
                                        "query" => $query, // we must repeat the query because we want to sign it
227 daniel-mar 202
                                        "system_id" => OIDplus::getSystemId(false)
139 daniel-mar 203
                                );
204
 
205
                                $signature = '';
239 daniel-mar 206
                                if (!@openssl_sign(json_encode($payload), $signature, OIDplus::config()->getValue('oidplus_private_key'))) {
360 daniel-mar 207
                                        return false; // throw new OIDplusException(_L('Signature failed'));
239 daniel-mar 208
                                }
139 daniel-mar 209
 
210
                                $data = array(
211
                                        "payload" => $payload,
212
                                        "signature" => base64_encode($signature)
213
                                );
214
 
215
                                $ch = curl_init();
216
                                curl_setopt($ch, CURLOPT_URL, 'https://oidplus.viathinksoft.com/reg2/query.php');
217
                                curl_setopt($ch, CURLOPT_POST, 1);
218
                                curl_setopt($ch, CURLOPT_POSTFIELDS, "query=$query&data=".base64_encode(json_encode($data)));
219
                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
220
                                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
221
                                curl_setopt($ch, CURLOPT_AUTOREFERER, true);
239 daniel-mar 222
                                if (!($res = @curl_exec($ch))) {
360 daniel-mar 223
                                        return false; // throw new OIDplusException(_L('Communication with ViaThinkSoft server failed: %1',curl_error($ch)));
239 daniel-mar 224
                                }
139 daniel-mar 225
                                curl_close($ch);
370 daniel-mar 226
 
227
                                $json = @json_decode($res, true);
228
 
229
                                if (!$json) {
230
                                        return false; // throw new OIDplusException(_L('JSON reply from ViaThinkSoft decoding error: %1',$res));
231
                                }
232
 
381 daniel-mar 233
                                if (isset($json['error']) || ($json['status'] < 0)) {
370 daniel-mar 234
                                        if (isset($json['error'])) {
235
                                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['error']));
236
                                        } else {
237
                                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['status']));
238
                                        }
239
                                }
139 daniel-mar 240
                        }
241
                } else {
242
                        if ($privacy_level == 0) {
380 daniel-mar 243
                                $adminExportPlugin = OIDplus::getPluginByOid('1.3.6.1.4.1.37476.2.5.2.4.3.400'); // OIDplusPageAdminOIDInfoExport
244
                                if (!is_null($adminExportPlugin)) {
139 daniel-mar 245
                                        ob_start();
246
                                        OIDplusPageAdminOIDInfoExport::outputXML(false); // no online check, because the query should be short (since the query is done while a visitor waits for the response)
247
                                        $oidinfo_xml = ob_get_contents();
248
                                        ob_end_clean();
249
                                } else {
250
                                        $oidinfo_xml = false;
251
                                }
252
                        } else {
253
                                $oidinfo_xml = false;
254
                        }
255
 
256 daniel-mar 256
                        $query = self::QUERY_REGISTER_V1;
139 daniel-mar 257
 
258
                        $root_oids = array();
227 daniel-mar 259
                        foreach (OIDplus::getEnabledObjectTypes() as $ot) {
139 daniel-mar 260
                                if ($ot::ns() == 'oid') {
261 daniel-mar 261
                                        $res = OIDplus::db()->query("select id from ###objects where " .
394 daniel-mar 262
                                                                    "parent = 'oid:' or " .
263
                                                                    // 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!
395 daniel-mar 264
                                                                    // (we assume hereby that RAs of well-known OIDs (e.g. IANA) will not use OIDplus for allocating OIDs)
394 daniel-mar 265
                                                                    "parent in (select oid from ###asn1id where well_known = 1) or " .
395 daniel-mar 266
                                                                    "parent in (select oid from ###iri where well_known = 1) or " .
267
                                                                    "id not in (select oid from ###asn1id where well_known = 1) or " .
268
                                                                    "id not in (select oid from ###iri where well_known = 1) " .
269
                                                                    // End of the special case handling
139 daniel-mar 270
                                                                    "order by ".OIDplus::db()->natOrder('id'));
236 daniel-mar 271
                                        while ($row = $res->fetch_array()) {
139 daniel-mar 272
                                                $root_oids[] = substr($row['id'],strlen('oid:'));
273
                                        }
274
                                }
275
                        }
276
                        $payload = array(
277
                                "query" => $query, // we must repeat the query because we want to sign it
278
                                "privacy_level" => $privacy_level,
227 daniel-mar 279
                                "system_id" => OIDplus::getSystemId(false),
139 daniel-mar 280
                                "public_key" => OIDplus::config()->getValue('oidplus_public_key'),
281
                                "system_url" => $system_url,
282
                                "hide_system_url" => 0,
283
                                "hide_public_key" => 0,
284
                                "admin_email" => OIDplus::config()->getValue('admin_email'),
257 daniel-mar 285
                                "system_title" => OIDplus::config()->getValue('system_title'),
139 daniel-mar 286
                                "oidinfo_xml" => @base64_encode($oidinfo_xml),
170 daniel-mar 287
                                "root_oids" => $root_oids,
288
                                "system_version" => OIDplus::getVersion(),
289
                                "system_install_type" => OIDplus::getInstallType()
139 daniel-mar 290
                        );
291
 
292
                        $signature = '';
239 daniel-mar 293
                        if (!@openssl_sign(json_encode($payload), $signature, OIDplus::config()->getValue('oidplus_private_key'))) {
360 daniel-mar 294
                                        return false; // throw new OIDplusException(_L('Signature failed'));
239 daniel-mar 295
                        }
139 daniel-mar 296
 
297
                        $data = array(
298
                                "payload" => $payload,
299
                                "signature" => base64_encode($signature)
300
                        );
301
 
302
                        $ch = curl_init();
303
                        curl_setopt($ch, CURLOPT_URL, 'https://oidplus.viathinksoft.com/reg2/query.php');
304
                        curl_setopt($ch, CURLOPT_POST, 1);
305
                        curl_setopt($ch, CURLOPT_POSTFIELDS, "query=$query&data=".base64_encode(json_encode($data)));
306
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
307
                        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
308
                        curl_setopt($ch, CURLOPT_AUTOREFERER, true);
239 daniel-mar 309
                        if (!($res = @curl_exec($ch))) {
360 daniel-mar 310
                                return false; // throw new OIDplusException(_L('Communication with ViaThinkSoft server failed: %1',curl_error($ch)));
239 daniel-mar 311
                        }
139 daniel-mar 312
                        curl_close($ch);
206 daniel-mar 313
 
370 daniel-mar 314
                        $json = @json_decode($res, true);
315
 
316
                        if (!$json) {
317
                                return false; // throw new OIDplusException(_L('JSON reply from ViaThinkSoft decoding error: %1',$res));
318
                        }
319
 
381 daniel-mar 320
                        if (isset($json['error']) || ($json['status'] < 0)) {
321
                                if (isset($json['error'])) {
322
                                        return false; // throw new OIDplusException(_L('Received error status code: %1',$json['error']));
323
                                } else {
324
                                        return false; // throw new OIDplusException(_L('Received error status code: %1',$json['status']));
325
                                }
326
                        } else if ($json['status'] == 99/*Hash conflict*/) {
288 daniel-mar 327
                                OIDplus::logger()->log("[WARN]A!", "Removing SystemID and key pair because there is a hash conflict with another OIDplus system!");
206 daniel-mar 328
 
329
                                // Delete the system ID since we have a conflict with the 31-bit hash!
330
                                OIDplus::config()->setValue('oidplus_private_key', '');
331
                                OIDplus::config()->setValue('oidplus_public_key', '');
332
 
333
                                // Try to generate a new system ID
227 daniel-mar 334
                                OIDplus::getPkiStatus(true);
206 daniel-mar 335
 
370 daniel-mar 336
                                // Enforce a new registration attempt at the next page visit
206 daniel-mar 337
                                // We will not try again here, because that might lead to an endless loop if the VTS server would always return 'HASH_CONFLCIT'
338
                                OIDplus::config()->setValue('reg_last_ping', 0);
339
                        }
139 daniel-mar 340
                }
341
        }
342
 
343
        public function init($html=true) {
263 daniel-mar 344
                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', '0', OIDplusConfig::PROTECTION_EDITABLE, function($value) {
345
                        if (($value != '0') && ($value != '1') && ($value != '2')) {
360 daniel-mar 346
                                throw new OIDplusException(_L('Please enter either 0, 1 or 2.'));
263 daniel-mar 347
                        }
348
                        // Now do a recheck and notify the ViaThinkSoft server
316 daniel-mar 349
                        if (($value == 2) || !OIDplus::baseConfig()->getValue('REGISTRATION_HIDE_SYSTEM', false)) {
350
                                OIDplus::config()->setValue('reg_last_ping', 0);
351
                                $this->sendRegistrationQuery($value);
352
                        }
263 daniel-mar 353
                });
354
                OIDplus::config()->prepareConfigKey('reg_ping_interval', 'Registration ping interval (in seconds)', '3600', OIDplusConfig::PROTECTION_HIDDEN, function($value) {
277 daniel-mar 355
 
263 daniel-mar 356
                });
357
                OIDplus::config()->prepareConfigKey('reg_last_ping', 'Last ping to ViaThinkSoft directory services', '0', OIDplusConfig::PROTECTION_HIDDEN, function($value) {
277 daniel-mar 358
 
263 daniel-mar 359
                });
362 daniel-mar 360
                OIDplus::config()->prepareConfigKey('oobe_registration_done', '"Out Of Box Experience" wizard for OIDplusPageAdminRegistration done once?', '0', OIDplusConfig::PROTECTION_HIDDEN, function($value) {});
277 daniel-mar 361
 
292 daniel-mar 362
                // Is it time to register / renew the directory entry?
294 daniel-mar 363
                // 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 364
                // 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 365
 
292 daniel-mar 366
                if (!OIDplus::baseConfig()->getValue('REGISTRATION_HIDE_SYSTEM', false)) {
367
                        $privacy_level = OIDplus::config()->getValue('reg_privacy');
139 daniel-mar 368
 
316 daniel-mar 369
                        if (php_sapi_name() !== 'cli') { // don't register when called from CLI, otherwise the oidinfo XML can't convert relative links into absolute links
292 daniel-mar 370
                                if ((time()-OIDplus::config()->getValue('reg_last_ping') >= OIDplus::config()->getValue('reg_ping_interval'))) {
371
                                        $this->sendRegistrationQuery();
139 daniel-mar 372
                                }
373
                        }
374
                }
375
        }
376
 
377
        public function tree(&$json, $ra_email=null, $nonjs=false, $req_goto='') {
281 daniel-mar 378
                if (!OIDplus::authUtils()::isAdminLoggedIn()) return false;
292 daniel-mar 379
 
139 daniel-mar 380
                if (file_exists(__DIR__.'/treeicon.png')) {
241 daniel-mar 381
                        $tree_icon = OIDplus::webpath(__DIR__).'treeicon.png';
139 daniel-mar 382
                } else {
383
                        $tree_icon = null; // default icon (folder)
384
                }
385
 
386
                $json[] = array(
141 daniel-mar 387
                        'id' => 'oidplus:srv_registration',
139 daniel-mar 388
                        'icon' => $tree_icon,
360 daniel-mar 389
                        'text' => _L('System registration')
139 daniel-mar 390
                );
391
 
392
                return true;
393
        }
394
 
395
        public function tree_search($request) {
396
                return false;
397
        }
292 daniel-mar 398
 
399
        public function implementsFeature($id) {
370 daniel-mar 400
                if (strtolower($id) == '1.3.6.1.4.1.37476.2.5.2.3.1') return true; // oobeEntry, oobeRequested
292 daniel-mar 401
                return false;
402
        }
403
 
362 daniel-mar 404
        public function oobeRequested(): bool {
405
                // Interface 1.3.6.1.4.1.37476.2.5.2.3.1
370 daniel-mar 406
 
362 daniel-mar 407
                return OIDplus::config()->getValue('oobe_registration_done') == '0';
408
        }
409
 
292 daniel-mar 410
        public function oobeEntry($step, $do_edits, &$errors_happened)/*: void*/ {
411
                // Interface 1.3.6.1.4.1.37476.2.5.2.3.1
412
 
360 daniel-mar 413
                echo '<p><u>'._L('Step %1: System registration and automatic publishing (optional)',$step).'</u></p>';
370 daniel-mar 414
 
362 daniel-mar 415
                if (file_exists(__DIR__ . '/info$'.OIDplus::getCurrentLang().'.html')) {
416
                        $info = file_get_contents(__DIR__ . '/info$'.OIDplus::getCurrentLang().'.html');
417
                } else {
418
                        $info = file_get_contents(__DIR__ . '/info.html');
419
                }
292 daniel-mar 420
 
362 daniel-mar 421
                // make sure the program works even if the user provided HTML is not UTF-8
422
                $info = iconv(mb_detect_encoding($info, mb_detect_order(), true), 'UTF-8//IGNORE', $info);
423
                $bom = pack('H*','EFBBBF');
424
                $info = preg_replace("/^$bom/", '', $info);
292 daniel-mar 425
 
362 daniel-mar 426
                echo $info;
427
 
353 daniel-mar 428
                if (!function_exists('curl_exec')) {
360 daniel-mar 429
                        echo '<p><font color="red">';
362 daniel-mar 430
                        echo _L('Note: The "CURL" PHP extension is not installed at your system. Please enable the PHP extension <code>php_curl</code>.').' ';
360 daniel-mar 431
                        echo _L('Therefore, you <b>cannot</b> register your OIDplus instance now.');
432
                        echo '</font></p>';
362 daniel-mar 433
                        if ($do_edits) {
434
                                OIDplus::config()->setValue('oobe_registration_done', '1');
435
                        }
353 daniel-mar 436
                        return;
437
                }
438
 
439
                $testurl = 'https://www.google.com/';
440
                $ch = curl_init();
441
                curl_setopt($ch, CURLOPT_URL, $testurl);
442
                curl_setopt($ch, CURLOPT_HEADER, TRUE);
443
                curl_setopt($ch, CURLOPT_NOBODY, TRUE);
444
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
445
                curl_exec($ch);
446
                $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
447
                curl_close($ch);
448
                if (!$httpCode) {
360 daniel-mar 449
                        echo '<p><font color="red">';
362 daniel-mar 450
                        echo _L('Note: 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 451
                        echo _L('Therefore, you <b>cannot</b> register your OIDplus instance now.');
452
                        echo '</font></p>';
362 daniel-mar 453
                        if ($do_edits) {
454
                                OIDplus::config()->setValue('oobe_registration_done', '1');
455
                        }
353 daniel-mar 456
                        return;
457
                }
458
 
292 daniel-mar 459
                $pki_status = OIDplus::getPkiStatus();
460
 
461
                if (!$pki_status) {
360 daniel-mar 462
                        echo '<p><font color="red">';
362 daniel-mar 463
                        echo _L('Note: Your system could not generate a private/public key pair. (OpenSSL is probably missing on your system).').' ';
360 daniel-mar 464
                        echo _L('Therefore, you <b>cannot</b> register your OIDplus instance now.');
465
                        echo '</font></p>';
362 daniel-mar 466
                        if ($do_edits) {
467
                                OIDplus::config()->setValue('oobe_registration_done', '1');
468
                        }
353 daniel-mar 469
                        return;
470
                }
292 daniel-mar 471
 
360 daniel-mar 472
                echo '<p>'._L('Privacy level').':</p><select name="reg_privacy" id="reg_privacy">';
292 daniel-mar 473
 
353 daniel-mar 474
                # ---
292 daniel-mar 475
 
353 daniel-mar 476
                echo '<option value="0"';
477
                if (isset($_REQUEST['sent'])) {
478
                        if (isset($_REQUEST['reg_privacy']) && ($_REQUEST['reg_privacy'] == 0)) echo ' selected';
479
                } else {
362 daniel-mar 480
                        if ((OIDplus::config()->getValue('reg_privacy') == 0) || !OIDplus::config()->getValue('oobe_registration_done')) {
353 daniel-mar 481
                                echo ' selected';
292 daniel-mar 482
                        } else {
353 daniel-mar 483
                                echo '';
292 daniel-mar 484
                        }
353 daniel-mar 485
                }
360 daniel-mar 486
                echo '>'._L('0 = Register to directory service and automatically publish RA/OID data at oid-info.com').'</option>';
292 daniel-mar 487
 
353 daniel-mar 488
                # ---
292 daniel-mar 489
 
353 daniel-mar 490
                echo '<option value="1"';
491
                if (isset($_REQUEST['sent'])) {
492
                        if (isset($_REQUEST['reg_privacy']) && ($_REQUEST['reg_privacy'] == 1)) echo ' selected';
493
                } else {
494
                        if ((OIDplus::config()->getValue('reg_privacy') == 1)) {
495
                                echo ' selected';
292 daniel-mar 496
                        } else {
353 daniel-mar 497
                                echo '';
292 daniel-mar 498
                        }
353 daniel-mar 499
                }
360 daniel-mar 500
                echo '>'._L('1 = Only register to directory service').'</option>';
292 daniel-mar 501
 
353 daniel-mar 502
                # ---
292 daniel-mar 503
 
353 daniel-mar 504
                echo '<option value="2"';
505
                if (isset($_REQUEST['sent'])) {
506
                        if (isset($_REQUEST['reg_privacy']) && ($_REQUEST['reg_privacy'] == 2)) echo ' selected';
507
                } else {
508
                        if ((OIDplus::config()->getValue('reg_privacy') == 2)) {
509
                                echo ' selected';
292 daniel-mar 510
                        } else {
353 daniel-mar 511
                                echo '';
292 daniel-mar 512
                        }
353 daniel-mar 513
                }
360 daniel-mar 514
                echo '>'._L('2 = Hide system').'</option>';
292 daniel-mar 515
 
353 daniel-mar 516
                # ---
292 daniel-mar 517
 
353 daniel-mar 518
                echo '</select>';
292 daniel-mar 519
 
353 daniel-mar 520
                $msg = '';
521
                if ($do_edits) {
522
                        try {
523
                                OIDplus::config()->setValue('reg_privacy', $_REQUEST['reg_privacy']);
362 daniel-mar 524
                                OIDplus::config()->setValue('oobe_registration_done', '1');
353 daniel-mar 525
                        } catch (Exception $e) {
526
                                $msg = $e->getMessage();
527
                                $errors_happened = true;
292 daniel-mar 528
                        }
353 daniel-mar 529
                }
530
                echo ' <font color="red"><b>'.$msg.'</b></font>';
292 daniel-mar 531
 
360 daniel-mar 532
                echo '<p>'._L('<i>Privacy information:</i> This setting can always be changed in the administrator login / control panel.').'<br>';
533
                echo _L('<a %1>Click here</a> for more information about privacy related topics.','href="../../../res/OIDplus/privacy_documentation.html" target="_blank"');
534
                echo '</p>';
292 daniel-mar 535
        }
536
 
366 daniel-mar 537
}