Subversion Repositories oidplus

Rev

Rev 125 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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. define('OUTPUT_FORMAT_SPACER', 2);
  21. define('OUTPUT_FORMAT_MAX_LINE_LENGTH', 80);
  22.  
  23. # ---
  24.  
  25. require_once __DIR__ . '/../../../../includes/oidplus.inc.php';
  26.  
  27. OIDplus::init(true);
  28.  
  29. header('Content-Type:text/plain; charset=UTF-8');
  30.  
  31. // Step 0: Get request parameter
  32.  
  33. if (php_sapi_name() == 'cli') {
  34.         if ($argc != 2) {
  35.                 echo "Syntax: $argv[0] <query>\n";
  36.                 exit(2);
  37.         }
  38.         $query = $argv[1];
  39. } else {
  40.         if (!isset($_REQUEST['query'])) {
  41.                 http_response_code(400);
  42.                 echo "Argument 'query' is missing\n";
  43.                 die();
  44.         }
  45.         $query = $_REQUEST['query'];
  46. }
  47.  
  48. $authTokens = explode('$', $query);
  49. $query = array_shift($authTokens);
  50.  
  51. $authToken = trim(OIDplus::config()->getValue('whois_auth_token'));
  52. if (empty($authToken)) $authToken = false;
  53.  
  54. $show_confidential = $authToken && in_array($authToken, $authTokens);
  55.  
  56. $query = str_replace('oid:.', 'oid:', $query); // allow leading dot
  57.  
  58. // Step 1: Collect data
  59.  
  60. $out = array();
  61.  
  62. $out[] = "query: $query";
  63.  
  64. $distance = null;
  65. $found = null;
  66.  
  67. try {
  68.         $obj = OIDplusObject::findFitting($query);
  69.         if (!$obj) $obj = OIDplusObject::parse($query); // in case we didn't find anything fitting, we take it as it is and later use getParent() to find something else
  70. } catch (Exception $e) {
  71.         $obj = null;
  72. }
  73.  
  74. if (!$obj) {
  75.         $found = false;
  76. } else {
  77.         $query = $obj->nodeId(); // this may sanitize/canonize identifiers
  78.         $res = OIDplus::db()->query("select * from ".OIDPLUS_TABLENAME_PREFIX."objects where id = ?", array($obj->nodeId()));
  79.         if (OIDplus::db()->num_rows($res) > 0) {
  80.                 $found = true;
  81.                 $distance = 0;
  82.         } else {
  83.                 $found = false;
  84.                 $objParent = OIDplusObject::parse($query)->getParent();
  85.                 if ($objParent) {
  86.                         $res = OIDplus::db()->query("select * from ".OIDPLUS_TABLENAME_PREFIX."objects where id = ?", array($objParent->nodeId()));
  87.                         $distance = $objParent->distance($query);
  88.                         assert(OIDplus::db()->num_rows($res) > 0);
  89.  
  90.                         $query = $objParent->nodeId();
  91.                         $obj = $objParent;
  92.                 }
  93.         }
  94. }
  95.  
  96. $continue = null;
  97. if (!$found) {
  98.         if (!is_null($distance)) {
  99.                 $out[] = "result: Not found; superior object found";
  100.                 $out[] = "distance: $distance";
  101.                 $continue = true;
  102.         } else {
  103.                 $out[] = "result: Not found";
  104.                 $continue = false;
  105.         }
  106. } else {
  107.         $out[] = "result: Found";
  108.         $continue = true;
  109. }
  110.  
  111. if ($continue) {
  112.         $out[] = "";
  113.         $out[] = "object: $query";
  114.         if ($obj->isConfidential() && !$show_confidential) {
  115.                 $out[] = "status: Confidential";
  116.         } else {
  117.                 $out[] = "status: Information available";
  118.  
  119.                 $row = OIDplus::db()->fetch_object($res);
  120.                 $obj = OIDplusObject::parse($row->id);
  121.  
  122.                 if (!empty($row->parent) && (!is_root($row->parent))) {
  123.                         $out[] = 'parent: ' . $row->parent . show_asn1_appendix($row->parent);
  124.                 }
  125.                 $out[] = 'name: ' . $row->title;
  126.  
  127.                 $cont = $row->description;
  128.                 $cont = preg_replace('@<a[^>]+href\s*=\s*["\']([^\'"]+)["\'][^>]*>(.+)<\s*/\s*a\s*>@ismU', '\2 (\1)', $cont);
  129.                 $out[] = 'description: ' . trim(html_entity_decode(strip_tags($cont)));
  130.  
  131.                 if (substr($query,0,4) === 'oid:') {
  132.                         $res2 = OIDplus::db()->query("select * from ".OIDPLUS_TABLENAME_PREFIX."asn1id where oid = ?", array($row->id));
  133.                         while ($row2 = OIDplus::db()->fetch_object($res2)) {
  134.                                 $out[] = 'identifier: ' . $row2->name;
  135.                         }
  136.  
  137.                         $res2 = OIDplus::db()->query("select * from ".OIDPLUS_TABLENAME_PREFIX."asn1id where standardized = 1 and oid = ?", array($row->id));
  138.                         while ($row2 = OIDplus::db()->fetch_object($res2)) {
  139.                                 $out[] = 'standardized-id: ' . $row2->name;
  140.                         }
  141.  
  142.                         $res2 = OIDplus::db()->query("select * from ".OIDPLUS_TABLENAME_PREFIX."iri where oid = ?", array($row->id));
  143.                         while ($row2 = OIDplus::db()->fetch_object($res2)) {
  144.                                 $out[] = 'unicode-label: ' . $row2->name;
  145.                         }
  146.  
  147.                         $res2 = OIDplus::db()->query("select * from ".OIDPLUS_TABLENAME_PREFIX."iri where longarc = 1 and oid = ?", array($row->id));
  148.                         while ($row2 = OIDplus::db()->fetch_object($res2)) {
  149.                                 $out[] = 'long-arc: ' . $row2->name;
  150.                         }
  151.                 }
  152.  
  153.                 $out[] = 'created: ' . $row->created;
  154.                 $out[] = 'updated: ' . $row->updated;
  155.  
  156.                 $res2 = OIDplus::db()->query("select * from ".OIDPLUS_TABLENAME_PREFIX."objects where parent = ? order by ".OIDplus::db()->natOrder('id'), array($row->id));
  157.                 if (OIDplus::db()->num_rows($res2) == 0) {
  158.                         // $out[] = 'subordinate: (none)';
  159.                 }
  160.                 while ($row2 = OIDplus::db()->fetch_object($res2)) {
  161.                         $out[] = 'subordinate: ' . $row2->id . show_asn1_appendix($row2->id);
  162.                 }
  163.  
  164.                 $out[] = '';
  165.  
  166.                 $res2 = OIDplus::db()->query("select * from ".OIDPLUS_TABLENAME_PREFIX."ra where email = ?", array($row->ra_email));
  167.                 if ($row2 = OIDplus::db()->fetch_object($res2)) {
  168.                         $out[] = 'ra: '.(!empty($row2->ra_name) ? $row2->ra_name : $row2->email);
  169.                         $out[] = 'ra-status: Information available';
  170.                         $out[] = 'ra-name: ' . $row2->ra_name;
  171.                         $out[] = 'ra-email: ' . $row->ra_email;
  172.                         $out[] = 'ra-personal-name: ' . $row2->personal_name;
  173.                         $out[] = 'ra-organization: ' . $row2->organization;
  174.                         $out[] = 'ra-office: ' . $row2->office;
  175.                         if ($row2->privacy && !$show_confidential) {
  176.                                 $out[] = 'ra-street: ' . (!empty($row2->street) ? '(redacted)' : '');
  177.                                 $out[] = 'ra-town: ' . (!empty($row2->zip_town) ? '(redacted)' : '');
  178.                                 $out[] = 'ra-country: ' . (!empty($row2->country) ? '(redacted)' : '');
  179.                                 $out[] = 'ra-phone: ' . (!empty($row2->phone) ? '(redacted)' : '');
  180.                                 $out[] = 'ra-mobile: ' . (!empty($row2->mobile) ? '(redacted)' : '');
  181.                                 $out[] = 'ra-fax: ' . (!empty($row2->fax) ? '(redacted)' : '');
  182.                         } else {
  183.                                 $out[] = 'ra-street: ' . $row2->street;
  184.                                 $out[] = 'ra-zip_town: ' . $row2->zip_town;
  185.                                 $out[] = 'ra-country: ' . $row2->country;
  186.                                 $out[] = 'ra-phone: ' . $row2->phone;
  187.                                 $out[] = 'ra-mobile: ' . $row2->mobile;
  188.                                 $out[] = 'ra-fax: ' . $row2->fax;
  189.                         }
  190.                         $out[] = 'ra-created: ' . $row2->registered;
  191.                         $out[] = 'ra-updated: ' . $row2->updated;
  192.                 } else {
  193.                         $out[] = 'ra: '.$row->ra_email;
  194.                         $out[] = "ra-status: Information unavailable";
  195.                 }
  196.         }
  197. }
  198.  
  199. // Step 2: Format output
  200.  
  201. ob_start();
  202.  
  203. $longest_key = 0;
  204. foreach ($out as $line) {
  205.         $longest_key = max($longest_key, strlen(trim(explode(':',$line,2)[0])));
  206. }
  207.  
  208. echo '% ' . str_repeat('*', OUTPUT_FORMAT_MAX_LINE_LENGTH-2)."\n";
  209.  
  210. foreach ($out as $line) {
  211.         if (trim($line) == '') {
  212.                 echo "\n";
  213.                 continue;
  214.         }
  215.  
  216.         $ary = explode(':', $line, 2);
  217.  
  218.         $key = trim($ary[0]);
  219.  
  220.         $value = trim($ary[1]);
  221.         $value = wordwrap($value, OUTPUT_FORMAT_MAX_LINE_LENGTH - $longest_key - strlen(':') - OUTPUT_FORMAT_SPACER);
  222.         $value = str_replace("\n", "\n$key:".str_repeat(' ', $longest_key-strlen($key)) . str_repeat(' ', OUTPUT_FORMAT_SPACER), $value);
  223.  
  224.         echo $key.':' . str_repeat(' ', $longest_key-strlen($key)) . str_repeat(' ', OUTPUT_FORMAT_SPACER) . (!empty($value) ? $value : '.') . "\n";
  225. }
  226.  
  227. echo '% ' . str_repeat('*', OUTPUT_FORMAT_MAX_LINE_LENGTH-2)."\n";
  228.  
  229. $cont = ob_get_contents();
  230. ob_end_clean();
  231.  
  232. echo $cont;
  233.  
  234. // Try to sign
  235.  
  236. if (OIDplus::pkiStatus(true)) {
  237.         $signature = '';
  238.         if (openssl_sign($cont, $signature, OIDplus::config()->getValue('oidplus_private_key'))) {
  239.                 $signature = base64_encode($signature);
  240.                 $signature = wordwrap($signature, 80, "\n", true);
  241.  
  242.                 $signature = "-----BEGIN RSA SIGNATURE-----\n".
  243.                              "$signature\n".
  244.                              "-----END RSA SIGNATURE-----\n";
  245.                 echo $signature;
  246.         }
  247. }
  248.  
  249. # ---
  250.  
  251. function show_asn1_appendix($id) {
  252.         if (substr($id,0,4) === 'oid:') {
  253.                 $appendix_asn1ids = array();
  254.                 $res3 = OIDplus::db()->query("select * from ".OIDPLUS_TABLENAME_PREFIX."asn1id where oid = ?", array($id));
  255.                 while ($row3 = OIDplus::db()->fetch_object($res3)) {
  256.                         $appendix_asn1ids[] = $row3->name;
  257.                 }
  258.  
  259.                 $appendix = implode(', ', $appendix_asn1ids);
  260.                 if (!empty($appendix)) $appendix = " ($appendix)";
  261.         } else {
  262.                 $appendix = '';
  263.         }
  264.         return $appendix;
  265. }
  266.  
  267. function is_root($id) {
  268.         return empty(explode(':',$id,2)[1]);
  269. }
  270.