Subversion Repositories oidplus

Rev

Rev 433 | 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);
413 daniel-mar 126
                        curl_setopt($ch, CURLOPT_POSTFIELDS, "query=".urlencode($query)."&compressed=1&data=".urlencode(base64_encode(gzdeflate(json_encode($data)))));
141 daniel-mar 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
 
433 daniel-mar 137
                        $out['title'] = _L('Registration live status');
138
 
370 daniel-mar 139
                        if (!$json) {
140
                                $out['icon'] = 'img/error_big.png';
141
                                $out['text'] = _L('JSON reply from ViaThinkSoft decoding error: %1',$res);
142
                                return;
143
                        }
144
 
381 daniel-mar 145
                        if (isset($json['error']) || ($json['status'] < 0)) {
370 daniel-mar 146
                                $out['icon'] = 'img/error_big.png';
147
                                if (isset($json['error'])) {
148
                                        $out['text'] = _L('Received error status code: %1',$json['error']);
149
                                } else {
150
                                        $out['text'] = _L('Received error status code: %1',$json['status']);
151
                                }
152
                                return;
153
                        }
154
 
366 daniel-mar 155
                        $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 156
                                        $json['content'];
141 daniel-mar 157
                }
139 daniel-mar 158
        }
159
 
370 daniel-mar 160
        protected function areWeRegistered() {
161
                // To check if we are registered. Check it "anonymously" (i.e. without revealing our system ID)
162
                $res = file_get_contents('https://oidplus.viathinksoft.com/reg2/query.php?query='.self::QUERY_LISTALLSYSTEMIDS_V1);
163
 
164
                $json = @json_decode($res, true);
165
 
166
                if (!$json) {
167
                        return false; // throw new OIDplusException(_L('JSON reply from ViaThinkSoft decoding error: %1',$res));
168
                }
169
 
381 daniel-mar 170
                if (isset($json['error']) || ($json['status'] < 0)) {
370 daniel-mar 171
                        if (isset($json['error'])) {
172
                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['error']));
173
                        } else {
174
                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['status']));
175
                        }
176
                }
177
 
178
                $list = $json['list'];
179
 
180
                return in_array(OIDplus::getSystemId(false), $list);
181
        }
182
 
140 daniel-mar 183
        public function sendRegistrationQuery($privacy_level=null) {
184
                if (is_null($privacy_level)) {
185
                        $privacy_level = OIDplus::config()->getValue('reg_privacy');
186
                }
139 daniel-mar 187
 
227 daniel-mar 188
                $system_url = OIDplus::getSystemUrl();
139 daniel-mar 189
 
175 daniel-mar 190
                // It is very important that we set the ping time NOW, because ViaThinkSoft might contact us during the ping,
191
                // and this would cause an endless loop!
192
                OIDplus::config()->setValue('reg_last_ping', time());
277 daniel-mar 193
 
239 daniel-mar 194
                if (!OIDplus::getPkiStatus()) return false;
175 daniel-mar 195
 
139 daniel-mar 196
                if ($privacy_level == 2) {
370 daniel-mar 197
                        // The user wants to unregister,  but we only unregister if we are registered
198
                        if ($this->areWeRegistered()) {
256 daniel-mar 199
                                $query = self::QUERY_UNREGISTER_V1;
139 daniel-mar 200
 
201
                                $payload = array(
202
                                        "query" => $query, // we must repeat the query because we want to sign it
227 daniel-mar 203
                                        "system_id" => OIDplus::getSystemId(false)
139 daniel-mar 204
                                );
205
 
206
                                $signature = '';
239 daniel-mar 207
                                if (!@openssl_sign(json_encode($payload), $signature, OIDplus::config()->getValue('oidplus_private_key'))) {
360 daniel-mar 208
                                        return false; // throw new OIDplusException(_L('Signature failed'));
239 daniel-mar 209
                                }
139 daniel-mar 210
 
211
                                $data = array(
212
                                        "payload" => $payload,
213
                                        "signature" => base64_encode($signature)
214
                                );
215
 
216
                                $ch = curl_init();
217
                                curl_setopt($ch, CURLOPT_URL, 'https://oidplus.viathinksoft.com/reg2/query.php');
218
                                curl_setopt($ch, CURLOPT_POST, 1);
413 daniel-mar 219
                                curl_setopt($ch, CURLOPT_POSTFIELDS, "query=".urlencode($query)."&compressed=1&data=".urlencode(base64_encode(gzdeflate(json_encode($data)))));
139 daniel-mar 220
                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
221
                                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
222
                                curl_setopt($ch, CURLOPT_AUTOREFERER, true);
239 daniel-mar 223
                                if (!($res = @curl_exec($ch))) {
360 daniel-mar 224
                                        return false; // throw new OIDplusException(_L('Communication with ViaThinkSoft server failed: %1',curl_error($ch)));
239 daniel-mar 225
                                }
139 daniel-mar 226
                                curl_close($ch);
370 daniel-mar 227
 
228
                                $json = @json_decode($res, true);
229
 
230
                                if (!$json) {
231
                                        return false; // throw new OIDplusException(_L('JSON reply from ViaThinkSoft decoding error: %1',$res));
232
                                }
233
 
381 daniel-mar 234
                                if (isset($json['error']) || ($json['status'] < 0)) {
370 daniel-mar 235
                                        if (isset($json['error'])) {
236
                                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['error']));
237
                                        } else {
238
                                                return false; // throw new OIDplusException(_L('Received error status code: %1',$json['status']));
239
                                        }
240
                                }
139 daniel-mar 241
                        }
242
                } else {
243
                        if ($privacy_level == 0) {
380 daniel-mar 244
                                $adminExportPlugin = OIDplus::getPluginByOid('1.3.6.1.4.1.37476.2.5.2.4.3.400'); // OIDplusPageAdminOIDInfoExport
245
                                if (!is_null($adminExportPlugin)) {
139 daniel-mar 246
                                        ob_start();
247
                                        OIDplusPageAdminOIDInfoExport::outputXML(false); // no online check, because the query should be short (since the query is done while a visitor waits for the response)
248
                                        $oidinfo_xml = ob_get_contents();
249
                                        ob_end_clean();
250
                                } else {
251
                                        $oidinfo_xml = false;
252
                                }
253
                        } else {
254
                                $oidinfo_xml = false;
255
                        }
256
 
256 daniel-mar 257
                        $query = self::QUERY_REGISTER_V1;
139 daniel-mar 258
 
259
                        $root_oids = array();
227 daniel-mar 260
                        foreach (OIDplus::getEnabledObjectTypes() as $ot) {
139 daniel-mar 261
                                if ($ot::ns() == 'oid') {
261 daniel-mar 262
                                        $res = OIDplus::db()->query("select id from ###objects where " .
396 daniel-mar 263
                                                                    "(parent = 'oid:' or " .
394 daniel-mar 264
                                                                    // 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 265
                                                                    "parent in (select oid from ###asn1id where well_known = ?) or " .
266
                                                                    "parent in (select oid from ###iri where well_known = ?)) and " .
396 daniel-mar 267
                                                                    // We assume hereby that RAs of well-known OIDs (e.g. IANA) will not use OIDplus for allocating OIDs:
443 daniel-mar 268
                                                                    "id not in (select oid from ###asn1id where well_known = ?) and " .
269
                                                                    "id not in (select oid from ###iri where well_known = ?) " .
270
                                                                    "order by ".OIDplus::db()->natOrder('id'), array(true, true, true, true));
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'))) {
396 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);
413 daniel-mar 305
                        curl_setopt($ch, CURLOPT_POSTFIELDS, "query=".urlencode($query)."&compressed=1&data=".urlencode(base64_encode(gzdeflate(json_encode($data)))));
139 daniel-mar 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
}