Subversion Repositories oidplus

Rev

Rev 1278 | Rev 1305 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. /*
  4.  * OIDplus 2.0
  5.  * Copyright 2019 - 2023 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. // ATTENTION: If you change something, please make sure that the changes
  21. //            are synchronous with OIDplusPageAdminAutomatedAJAXCalls
  22.  
  23. namespace ViaThinkSoft\OIDplus;
  24.  
  25. // phpcs:disable PSR1.Files.SideEffects
  26. \defined('INSIDE_OIDPLUS') or die;
  27. // phpcs:enable PSR1.Files.SideEffects
  28.  
  29. class OIDplusPageRaAutomatedAJAXCalls extends OIDplusPagePluginRa {
  30.  
  31.         /**
  32.          * @param array $params
  33.          * @return array
  34.          * @throws OIDplusException
  35.          */
  36.         private function action_Blacklist(array $params): array {
  37.                 if (!OIDplus::baseConfig()->getValue('JWT_ALLOW_AJAX_USER', true)) {
  38.                         throw new OIDplusException(_L('The administrator has disabled this feature. (Base configuration setting %1).','JWT_ALLOW_AJAX_USER'));
  39.                 }
  40.  
  41.                 _CheckParamExists($params, 'user');
  42.                 $ra_email = $params['user'];
  43.  
  44.                 if (!OIDplus::authUtils()->isRaLoggedIn($ra_email) && !OIDplus::authUtils()->isAdminLoggedIn()) {
  45.                         throw new OIDplusHtmlException(_L('You need to <a %1>log in</a> as the requested RA %2 or as admin.',OIDplus::gui()->link('oidplus:login$ra$'.$ra_email),'<b>'.htmlentities($ra_email).'</b>'), null, 401);
  46.                 }
  47.  
  48.                 $gen = OIDplusAuthContentStoreJWT::JWT_GENERATOR_AJAX;
  49.                 $sub = $ra_email;
  50.  
  51.                 OIDplusAuthContentStoreJWT::jwtBlacklist($gen, $sub);
  52.  
  53.                 return array("status" => 0);
  54.         }
  55.  
  56.         /**
  57.          * @param string $actionID
  58.          * @param array $params
  59.          * @return array
  60.          * @throws OIDplusException
  61.          */
  62.         public function action(string $actionID, array $params): array {
  63.                 if ($actionID == 'blacklistJWT') {
  64.                         return $this->action_Blacklist($params);
  65.                 } else {
  66.                         return parent::action($actionID, $params);
  67.                 }
  68.         }
  69.  
  70.         /**
  71.          * @param string $id
  72.          * @param array $out
  73.          * @param bool $handled
  74.          * @return void
  75.          * @throws OIDplusException
  76.          */
  77.         public function gui(string $id, array &$out, bool &$handled) {
  78.                 $parts = explode('$',$id,2);
  79.                 $ra_email = $parts[1] ?? '';
  80.  
  81.                 if ($parts[0] == 'oidplus:automated_ajax_information_ra') {
  82.                         $handled = true;
  83.  
  84.                         $out['title'] = _L('Automated AJAX calls');
  85.                         $out['icon'] = file_exists(__DIR__.'/img/main_icon.png') ? OIDplus::webpath(__DIR__,OIDplus::PATH_RELATIVE).'img/main_icon.png' : '';
  86.  
  87.                         if (!OIDplus::authUtils()->isRaLoggedIn($ra_email) && !OIDplus::authUtils()->isAdminLoggedIn()) {
  88.                                 throw new OIDplusHtmlException(_L('You need to <a %1>log in</a> as the requested RA %2 or as admin.',OIDplus::gui()->link('oidplus:login$ra$'.$ra_email),'<b>'.htmlentities($ra_email).'</b>'), $out['title'], 401);
  89.                         }
  90.  
  91.                         if (!OIDplus::baseConfig()->getValue('JWT_ALLOW_AJAX_USER', true)) {
  92.                                 throw new OIDplusException(_L('The administrator has disabled this feature. (Base configuration setting %1).','JWT_ALLOW_AJAX_USER'), $out['title']);
  93.                         }
  94.  
  95.                         $gen = OIDplusAuthContentStoreJWT::JWT_GENERATOR_AJAX;
  96.                         $sub = $ra_email;
  97.  
  98.                         $authSimulation = new OIDplusAuthContentStoreJWT();
  99.                         $authSimulation->raLogin($ra_email);
  100.                         $authSimulation->setValue('oidplus_generator', $gen);
  101.                         $token = $authSimulation->getJWTToken();
  102.  
  103.                         $out['text'] .= '<p>'._L('You can make automated calls to your OIDplus account by calling the AJAX API.').'</p>';
  104.                         $out['text'] .= '<p>'._L('The URL for the AJAX script is:').'</p>';
  105.                         $out['text'] .= '<p><b>'.OIDplus::webpath(null,OIDplus::PATH_ABSOLUTE_CANONICAL).'ajax.php</b></p>';
  106.                         $out['text'] .= '<p>'._L('You must at least provide following fields:').'</p>';
  107.                         $out['text'] .= '<p><pre id="oidplus_auth_jwt">';
  108.                         $out['text'] .= htmlentities(OIDplusAuthContentStoreJWT::COOKIE_NAME).' = "'.htmlentities($token).'"'."\n";
  109.                         $out['text'] .= '</pre></p>';
  110.                         $out['text'] .= '<p><input type="button" value="'._L('Copy to clipboard').'" onClick="copyToClipboard(oidplus_auth_jwt)"></p>';
  111.                         $out['text'] .= '<p>'._L('Please keep this information confidential!').'</p>';
  112.                         $out['text'] .= '<p>'._L('The JWT-token (secret!) will automatically perform a one-time-login to fulfill the request. The other fields are the normal fields which are called during the usual operation of OIDplus.').'</p>';
  113.                         $out['text'] .= '<p>'._L('Currently, there is no documentation for the AJAX calls. However, you can look at the <b>script.js</b> files of the plugins to see the field names being used. You can also enable network analysis in your web browser debugger (F12) to see the request headers sent to the server during the operation of OIDplus.').'</p>';
  114.  
  115.                         $out['text'] .= '<h2>'._L('Blacklisted tokens').'</h2>';
  116.                         $bl_time = OIDplusAuthContentStoreJWT::jwtGetBlacklistTime($gen, $sub);
  117.                         if ($bl_time == 0) {
  118.                                 $out['text'] .= '<p>'._L('None of the previously generated JWT tokens have been blacklisted.').'</p>';
  119.                         } else {
  120.                                 $out['text'] .= '<p>'._L('All tokens generated before %1 have been blacklisted.',date('d F Y, H:i:s',$bl_time+1)).'</p>';
  121.                         }
  122.                         $out['text'] .= '<button type="button" name="btn_blacklist_jwt" id="btn_blacklist_jwt" class="btn btn-danger btn-xs" onclick="OIDplusPageRaAutomatedAJAXCalls.blacklistJWT('.js_escape($ra_email).')">'._L('Blacklist all previously generated tokens').'</button>';
  123.  
  124.                         $out['text'] .= '<h2>'._L('Example for adding OID 2.999.123 using JavaScript').'</h2>';
  125.                         $cont = file_get_contents(__DIR__.'/examples/example_js.html');
  126.                         $cont = str_replace('<url>', OIDplus::webpath(null,OIDplus::PATH_ABSOLUTE_CANONICAL).'ajax.php', $cont);
  127.                         $cont = str_replace('<token>', $token, $cont);
  128.                         $out['text'] .= '<pre id="example_js">'.htmlentities($cont).'</pre>';
  129.                         $out['text'] .= '<p><input type="button" value="'._L('Copy to clipboard').'" onClick="copyToClipboard(example_js)"></p>';
  130.  
  131.                         $out['text'] .= '<h2>'._L('Example for adding OID 2.999.123 using PHP (located at a foreign server)').'</h2>';
  132.                         $cont = file_get_contents(__DIR__.'/examples/example_php.phps');
  133.                         $cont = str_replace('<url>', OIDplus::webpath(null,OIDplus::PATH_ABSOLUTE_CANONICAL).'ajax.php', $cont);
  134.                         $cont = str_replace('<token>', $token, $cont);
  135.                         $out['text'] .= '<pre id="example_php">'.preg_replace("@<br.*>@ismU","",highlight_string($cont,true)).'</pre>';
  136.                         $out['text'] .= '<p><input type="button" value="'._L('Copy to clipboard').'" onClick="copyToClipboard(example_php)"></p>';
  137.  
  138.                         $out['text'] .= '<h2>'._L('Example for adding OID 2.999.123 using Python').'</h2>';
  139.                         $cont = file_get_contents(__DIR__.'/examples/example_python.py');
  140.                         $cont = str_replace('<url>', OIDplus::webpath(null,OIDplus::PATH_ABSOLUTE_CANONICAL).'ajax.php', $cont);
  141.                         $cont = str_replace('<token>', $token, $cont);
  142.                         $out['text'] .= '<pre id="example_python">'.htmlentities($cont).'</pre>';
  143.                         $out['text'] .= '<p><input type="button" value="'._L('Copy to clipboard').'" onClick="copyToClipboard(example_python)"></p>';
  144.  
  145.                         $out['text'] .= '<h2>'._L('Example for adding OID 2.999.123 using VBScript').'</h2>';
  146.                         $cont = file_get_contents(__DIR__.'/examples/example_vbs.vbs');
  147.                         $cont = str_replace('<url>', OIDplus::webpath(null,OIDplus::PATH_ABSOLUTE_CANONICAL).'ajax.php', $cont);
  148.                         $cont = str_replace('<token>', $token, $cont);
  149.                         $out['text'] .= '<pre id="example_vbs">'.htmlentities($cont).'</pre>';
  150.                         $out['text'] .= '<p><input type="button" value="'._L('Copy to clipboard').'" onClick="copyToClipboard(example_vbs)"></p>';
  151.                 }
  152.         }
  153.  
  154.         /**
  155.          * @param array $json
  156.          * @param string|null $ra_email
  157.          * @param bool $nonjs
  158.          * @param string $req_goto
  159.          * @return bool
  160.          * @throws OIDplusException
  161.          */
  162.         public function tree(array &$json, string $ra_email=null, bool $nonjs=false, string $req_goto=''): bool {
  163.                 if (!$ra_email) return false;
  164.                 if (!OIDplus::authUtils()->isRaLoggedIn($ra_email) && !OIDplus::authUtils()->isAdminLoggedIn()) return false;
  165.  
  166.                 if (file_exists(__DIR__.'/img/main_icon16.png')) {
  167.                         $tree_icon = OIDplus::webpath(__DIR__,OIDplus::PATH_RELATIVE).'img/main_icon16.png';
  168.                 } else {
  169.                         $tree_icon = null; // default icon (folder)
  170.                 }
  171.  
  172.                 $json[] = array(
  173.                         'id' => 'oidplus:automated_ajax_information_ra$'.$ra_email,
  174.                         'icon' => $tree_icon,
  175.                         'text' => _L('Automated AJAX calls')
  176.                 );
  177.  
  178.                 return true;
  179.         }
  180.  
  181.         /**
  182.          * @param string $request
  183.          * @return array|false
  184.          */
  185.         public function tree_search(string $request) {
  186.                 return false;
  187.         }
  188. }
  189.