Rev 148 | 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 | |||
20 | if (!defined('IN_OIDPLUS')) die(); |
||
21 | |||
22 | define('QUERY_REGISTER_V1', '1.3.6.1.4.1.37476.2.5.2.1.1.1'); |
||
23 | define('QUERY_UNREGISTER_V1', '1.3.6.1.4.1.37476.2.5.2.1.2.1'); |
||
24 | define('QUERY_LISTALLSYSTEMIDS_V1', '1.3.6.1.4.1.37476.2.5.2.1.3.1'); |
||
141 | daniel-mar | 25 | define('QUERY_LIVESTATUS_V1', '1.3.6.1.4.1.37476.2.5.2.1.4.1'); |
139 | daniel-mar | 26 | |
148 | daniel-mar | 27 | class OIDplusPageAdminRegistration extends OIDplusPagePlugin { |
139 | daniel-mar | 28 | public function type() { |
29 | return 'admin'; |
||
30 | } |
||
31 | |||
32 | public function priority() { |
||
33 | return 120; |
||
34 | } |
||
35 | |||
36 | public function action(&$handled) { |
||
37 | // Nothing |
||
38 | } |
||
39 | |||
40 | public function cfgSetValue($name, $value) { |
||
41 | if ($name == 'reg_privacy') { |
||
42 | if (($value != '0') && ($value != '1') && ($value != '2')) { |
||
43 | throw new Exception("Please enter either 0, 1 or 2."); |
||
44 | } |
||
140 | daniel-mar | 45 | // Now do a recheck and notify the ViaThinkSoft server |
46 | OIDplus::config()->setValue('reg_last_ping', 0); |
||
47 | $this->sendRegistrationQuery($value); |
||
139 | daniel-mar | 48 | } |
49 | } |
||
50 | |||
51 | public function gui($id, &$out, &$handled) { |
||
141 | daniel-mar | 52 | if ($id === 'oidplus:srv_registration') { |
139 | daniel-mar | 53 | $handled = true; |
141 | daniel-mar | 54 | $out['title'] = 'System registration settings'; |
148 | daniel-mar | 55 | $out['icon'] = file_exists(__DIR__.'/icon_big.png') ? 'plugins/'.basename(dirname(__DIR__)).'/'.basename(__DIR__).'/icon_big.png' : ''; |
139 | daniel-mar | 56 | |
57 | if (!OIDplus::authUtils()::isAdminLoggedIn()) { |
||
58 | $out['icon'] = 'img/error_big.png'; |
||
59 | $out['text'] .= '<p>You need to <a '.oidplus_link('oidplus:login').'>log in</a> as administrator.</p>'; |
||
60 | } else { |
||
61 | $out['text'] = '<p>The registration of your OIDplus installation has various advantages: The public key of your system is published, so that users can check the integrity of your data (e.g. signed OID-over-WHOIS requests). You can optionally also enable the automatic publishing of your public OID information to the repository oid-info.com.</p>'. |
||
142 | daniel-mar | 62 | '<p><input type="button" onclick="openOidInPanel(\'oidplus:srvreg_status\');" value="Check status of the registration and collected data"></p>'; |
139 | daniel-mar | 63 | |
64 | if (!function_exists('openssl_sign')) { |
||
65 | $out['text'] .= '<p><font color="red">Error: OpenSSL plugin is missing in PHP. You cannot (un)register your OIDplus instance.</font></p>'; |
||
66 | } else { |
||
67 | $out['text'] .= '<p>You can adjust your privacy level here:</p><p><select name="reg_privacy" id="reg_privacy">'; |
||
68 | |||
69 | # --- |
||
70 | |||
71 | $out['text'] .= '<option value="0"'; |
||
72 | if (OIDplus::config()->getValue('reg_privacy') == 0) { |
||
73 | $out['text'] .= ' selected'; |
||
74 | } else { |
||
75 | $out['text'] .= ''; |
||
76 | } |
||
77 | $out['text'] .= '>0 = Register to directory service and automatically publish RA/OID data at oid-info.com</option>'; |
||
78 | |||
79 | # --- |
||
80 | |||
81 | $out['text'] .= '<option value="1"'; |
||
82 | if (OIDplus::config()->getValue('reg_privacy') == 1) { |
||
83 | $out['text'] .= ' selected'; |
||
84 | } else { |
||
85 | $out['text'] .= ''; |
||
86 | } |
||
87 | $out['text'] .= '>1 = Only register to directory service</option>'; |
||
88 | |||
89 | # --- |
||
90 | |||
91 | $out['text'] .= '<option value="2"'; |
||
92 | if (OIDplus::config()->getValue('reg_privacy') == 2) { |
||
93 | $out['text'] .= ' selected'; |
||
94 | } else { |
||
95 | $out['text'] .= ''; |
||
96 | } |
||
97 | $out['text'] .= '>2 = Hide system</option>'; |
||
98 | |||
99 | # --- |
||
100 | |||
101 | $out['text'] .= '</select> <input type="button" value="Change" onclick="crudActionRegPrivacyUpdate()"></p>'; |
||
102 | |||
103 | $out['text'] .= '<p>After clicking "change", your OIDplus installation will contact the ViaThinkSoft server to adjust (add or remove information) your privacy setting. This may take a few minutes.</p>'; |
||
104 | } |
||
105 | |||
142 | daniel-mar | 106 | $out['text'] .= '<p><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>.'; |
139 | daniel-mar | 107 | } |
108 | } |
||
141 | daniel-mar | 109 | if ($id === 'oidplus:srvreg_status') { |
110 | $handled = true; |
||
111 | |||
112 | $query = QUERY_LIVESTATUS_V1; |
||
113 | |||
114 | $payload = array( |
||
115 | "query" => $query, // we must repeat the query because we want to sign it |
||
116 | "system_id" => OIDplus::system_id(false) |
||
117 | ); |
||
118 | |||
119 | $signature = ''; |
||
120 | openssl_sign(json_encode($payload), $signature, OIDplus::config()->getValue('oidplus_private_key')); |
||
121 | |||
122 | $data = array( |
||
123 | "payload" => $payload, |
||
124 | "signature" => base64_encode($signature) |
||
125 | ); |
||
126 | |||
127 | $ch = curl_init(); |
||
128 | curl_setopt($ch, CURLOPT_URL, 'https://oidplus.viathinksoft.com/reg2/query.php'); |
||
129 | curl_setopt($ch, CURLOPT_POST, 1); |
||
130 | curl_setopt($ch, CURLOPT_POSTFIELDS, "query=$query&data=".base64_encode(json_encode($data))); |
||
131 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
||
132 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
||
133 | curl_setopt($ch, CURLOPT_AUTOREFERER, true); |
||
134 | $res = curl_exec($ch); |
||
135 | curl_close($ch); |
||
136 | // die("RES: $res\n"); |
||
137 | // if ($res == 'OK') ... |
||
138 | |||
139 | $out['title'] = 'Registration live status'; |
||
142 | daniel-mar | 140 | $out['text'] = '<p><a '.oidplus_link('oidplus:srv_registration').'><img src="img/arrow_back.png" width="16"> Go back to registration settings</a></p>' . |
141 | $res; |
||
141 | daniel-mar | 142 | } |
139 | daniel-mar | 143 | } |
144 | |||
140 | daniel-mar | 145 | public function sendRegistrationQuery($privacy_level=null) { |
146 | if (is_null($privacy_level)) { |
||
147 | $privacy_level = OIDplus::config()->getValue('reg_privacy'); |
||
148 | } |
||
139 | daniel-mar | 149 | |
150 | $system_url = OIDplus::system_url(); |
||
151 | |||
152 | if ($privacy_level == 2) { |
||
153 | // The user wants to unregister |
||
154 | // but we only unregister if we are registered. Check this "anonymously" (i.e. without revealing our system ID) |
||
155 | if (in_array(OIDplus::system_id(false), explode(';',file_get_contents('https://oidplus.viathinksoft.com/reg2/query.php?query='.QUERY_LISTALLSYSTEMIDS_V1)))) { |
||
156 | $query = QUERY_UNREGISTER_V1; |
||
157 | |||
158 | $payload = array( |
||
159 | "query" => $query, // we must repeat the query because we want to sign it |
||
160 | "system_id" => OIDplus::system_id(false) |
||
161 | ); |
||
162 | |||
163 | $signature = ''; |
||
164 | openssl_sign(json_encode($payload), $signature, OIDplus::config()->getValue('oidplus_private_key')); |
||
165 | |||
166 | $data = array( |
||
167 | "payload" => $payload, |
||
168 | "signature" => base64_encode($signature) |
||
169 | ); |
||
170 | |||
171 | $ch = curl_init(); |
||
172 | curl_setopt($ch, CURLOPT_URL, 'https://oidplus.viathinksoft.com/reg2/query.php'); |
||
173 | curl_setopt($ch, CURLOPT_POST, 1); |
||
174 | curl_setopt($ch, CURLOPT_POSTFIELDS, "query=$query&data=".base64_encode(json_encode($data))); |
||
175 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
||
176 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
||
177 | curl_setopt($ch, CURLOPT_AUTOREFERER, true); |
||
178 | $res = curl_exec($ch); |
||
179 | curl_close($ch); |
||
180 | // die("RES: $res\n"); |
||
181 | // if ($res == 'OK') ... |
||
182 | } |
||
183 | } else { |
||
184 | if ($privacy_level == 0) { |
||
185 | if (class_exists('OIDplusPageAdminOIDInfoExport')) { |
||
186 | ob_start(); |
||
187 | OIDplusPageAdminOIDInfoExport::outputXML(false); // no online check, because the query should be short (since the query is done while a visitor waits for the response) |
||
188 | $oidinfo_xml = ob_get_contents(); |
||
189 | ob_end_clean(); |
||
190 | } else { |
||
191 | $oidinfo_xml = false; |
||
192 | } |
||
193 | } else { |
||
194 | $oidinfo_xml = false; |
||
195 | } |
||
196 | |||
197 | $query = QUERY_REGISTER_V1; |
||
198 | |||
199 | $root_oids = array(); |
||
200 | foreach (OIDplus::getRegisteredObjectTypes() as $ot) { |
||
201 | if ($ot::ns() == 'oid') { |
||
202 | $res = OIDplus::db()->query("select id from ".OIDPLUS_TABLENAME_PREFIX."objects where " . |
||
203 | "parent = 'oid:' " . |
||
204 | "order by ".OIDplus::db()->natOrder('id')); |
||
205 | while ($row = OIDplus::db()->fetch_array($res)) { |
||
206 | $root_oids[] = substr($row['id'],strlen('oid:')); |
||
207 | } |
||
208 | } |
||
209 | } |
||
210 | $payload = array( |
||
211 | "query" => $query, // we must repeat the query because we want to sign it |
||
212 | "privacy_level" => $privacy_level, |
||
213 | "system_id" => OIDplus::system_id(false), |
||
214 | "public_key" => OIDplus::config()->getValue('oidplus_public_key'), |
||
215 | "system_url" => $system_url, |
||
216 | "hide_system_url" => 0, |
||
217 | "hide_public_key" => 0, |
||
218 | "admin_email" => OIDplus::config()->getValue('admin_email'), |
||
219 | "system_title" => OIDplus::config()->systemTitle(), |
||
220 | "oidinfo_xml" => @base64_encode($oidinfo_xml), |
||
221 | "root_oids" => $root_oids |
||
222 | ); |
||
223 | |||
224 | $signature = ''; |
||
225 | openssl_sign(json_encode($payload), $signature, OIDplus::config()->getValue('oidplus_private_key')); |
||
226 | |||
227 | $data = array( |
||
228 | "payload" => $payload, |
||
229 | "signature" => base64_encode($signature) |
||
230 | ); |
||
231 | |||
232 | $ch = curl_init(); |
||
233 | curl_setopt($ch, CURLOPT_URL, 'https://oidplus.viathinksoft.com/reg2/query.php'); |
||
234 | curl_setopt($ch, CURLOPT_POST, 1); |
||
235 | curl_setopt($ch, CURLOPT_POSTFIELDS, "query=$query&data=".base64_encode(json_encode($data))); |
||
236 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
||
237 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
||
238 | curl_setopt($ch, CURLOPT_AUTOREFERER, true); |
||
239 | $res = curl_exec($ch); |
||
240 | curl_close($ch); |
||
241 | // die("RES: $res\n"); |
||
242 | // if ($res == 'OK') ... |
||
243 | } |
||
244 | |||
245 | OIDplus::config()->setValue('reg_last_ping', time()); |
||
246 | } |
||
247 | |||
248 | public function init($html=true) { |
||
249 | OIDplus::config()->prepareConfigKey('reg_wizard_done', 'Registration wizard done once?', '0', 1, 0); |
||
250 | 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', 0, 1); |
||
251 | OIDplus::config()->prepareConfigKey('reg_ping_interval', 'Registration ping interval (in seconds)', '3600', 0, 0); |
||
252 | OIDplus::config()->prepareConfigKey('reg_last_ping', 'Last ping to ViaThinkSoft directory services', '0', 1, 0); |
||
253 | |||
150 | daniel-mar | 254 | // REGISTRATION_HIDE_SYSTEM is an undocumented constant that can be put in the config.inc.php files of a test system accessing the same database as the productive system that is registered. |
255 | // This avoids that the URL of the productive system is overridden with the test system URL (since they use the same database, they also have the same system ID) |
||
256 | if (function_exists('openssl_sign') && !defined('REGISTRATION_HIDE_SYSTEM')) { |
||
139 | daniel-mar | 257 | // Show registration wizard once |
258 | |||
259 | if ($html && (OIDplus::config()->getValue('reg_wizard_done') != '1')) { |
||
260 | if (basename($_SERVER['SCRIPT_NAME']) != 'registration.php') { |
||
261 | if ($system_url = OIDplus::system_url()) { |
||
148 | daniel-mar | 262 | header('Location:'.$system_url.'plugins/'.basename(dirname(__DIR__)).'/'.basename(__DIR__).'/registration.php'); |
139 | daniel-mar | 263 | } else { |
148 | daniel-mar | 264 | header('Location:plugins/'.basename(dirname(__DIR__)).'/'.basename(__DIR__).'/registration.php'); |
139 | daniel-mar | 265 | } |
266 | die(); |
||
267 | } |
||
268 | } |
||
269 | |||
270 | // Is it time to register / renew directory entry? |
||
271 | |||
272 | if (OIDplus::config()->getValue('reg_wizard_done') == '1') { |
||
273 | $privacy_level = OIDplus::config()->getValue('reg_privacy'); |
||
274 | |||
275 | if ((time()-OIDplus::config()->getValue('reg_last_ping') >= OIDplus::config()->getValue('reg_ping_interval'))) { |
||
276 | $this->sendRegistrationQuery(); |
||
277 | } |
||
278 | } |
||
279 | } |
||
280 | } |
||
281 | |||
282 | public function tree(&$json, $ra_email=null, $nonjs=false, $req_goto='') { |
||
283 | if (file_exists(__DIR__.'/treeicon.png')) { |
||
148 | daniel-mar | 284 | $tree_icon = 'plugins/'.basename(dirname(__DIR__)).'/'.basename(__DIR__).'/treeicon.png'; |
139 | daniel-mar | 285 | } else { |
286 | $tree_icon = null; // default icon (folder) |
||
287 | } |
||
288 | |||
289 | $json[] = array( |
||
141 | daniel-mar | 290 | 'id' => 'oidplus:srv_registration', |
139 | daniel-mar | 291 | 'icon' => $tree_icon, |
292 | 'text' => 'Registration' |
||
293 | ); |
||
294 | |||
295 | return true; |
||
296 | } |
||
297 | |||
298 | public function tree_search($request) { |
||
299 | return false; |
||
300 | } |
||
301 | } |
||
302 | |||
148 | daniel-mar | 303 | OIDplus::registerPagePlugin(new OIDplusPageAdminRegistration()); |