Subversion Repositories oidplus

Rev

Rev 1266 | Rev 1293 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
635 daniel-mar 1
<?php
2
 
3
/*
4
 * OIDplus 2.0
1086 daniel-mar 5
 * Copyright 2019 - 2023 Daniel Marschall, ViaThinkSoft
635 daniel-mar 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
 
1050 daniel-mar 23
namespace ViaThinkSoft\OIDplus;
635 daniel-mar 24
 
1086 daniel-mar 25
// phpcs:disable PSR1.Files.SideEffects
26
\defined('INSIDE_OIDPLUS') or die;
27
// phpcs:enable PSR1.Files.SideEffects
28
 
635 daniel-mar 29
class OIDplusPageRaAutomatedAJAXCalls extends OIDplusPagePluginRa {
30
 
1116 daniel-mar 31
        /**
32
         * @param string $actionID
33
         * @param array $params
1143 daniel-mar 34
         * @return array
1116 daniel-mar 35
         * @throws OIDplusException
36
         */
37
        public function action(string $actionID, array $params): array {
635 daniel-mar 38
                if ($actionID == 'blacklistJWT') {
39
                        if (!OIDplus::baseConfig()->getValue('JWT_ALLOW_AJAX_USER', true)) {
40
                                throw new OIDplusException(_L('The administrator has disabled this feature. (Base configuration setting %1).','JWT_ALLOW_AJAX_USER'));
41
                        }
42
 
43
                        _CheckParamExists($params, 'user');
44
                        $ra_email = $params['user'];
45
 
46
                        if (!OIDplus::authUtils()->isRaLoggedIn($ra_email) && !OIDplus::authUtils()->isAdminLoggedIn()) {
1266 daniel-mar 47
                                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);
635 daniel-mar 48
                        }
49
 
50
                        $gen = OIDplusAuthContentStoreJWT::JWT_GENERATOR_AJAX;
51
                        $sub = $ra_email;
52
 
53
                        OIDplusAuthContentStoreJWT::jwtBlacklist($gen, $sub);
54
 
55
                        return array("status" => 0);
56
                } else {
1116 daniel-mar 57
                        return parent::action($actionID, $params);
635 daniel-mar 58
                }
59
        }
60
 
1116 daniel-mar 61
        /**
62
         * @param string $id
63
         * @param array $out
64
         * @param bool $handled
65
         * @return void
66
         * @throws OIDplusException
67
         */
68
        public function gui(string $id, array &$out, bool &$handled) {
1278 daniel-mar 69
                $parts = explode('$',$id,2);
70
                $ra_email = $parts[1] ?? '';
71
 
72
                if ($parts[0] == 'oidplus:automated_ajax_information_ra') {
635 daniel-mar 73
                        $handled = true;
74
 
75
                        $out['title'] = _L('Automated AJAX calls');
801 daniel-mar 76
                        $out['icon'] = file_exists(__DIR__.'/img/main_icon.png') ? OIDplus::webpath(__DIR__,OIDplus::PATH_RELATIVE).'img/main_icon.png' : '';
635 daniel-mar 77
 
78
                        if (!OIDplus::authUtils()->isRaLoggedIn($ra_email) && !OIDplus::authUtils()->isAdminLoggedIn()) {
1266 daniel-mar 79
                                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);
635 daniel-mar 80
                        }
81
 
82
                        if (!OIDplus::baseConfig()->getValue('JWT_ALLOW_AJAX_USER', true)) {
1206 daniel-mar 83
                                throw new OIDplusException(_L('The administrator has disabled this feature. (Base configuration setting %1).','JWT_ALLOW_AJAX_USER'), $out['title']);
635 daniel-mar 84
                        }
85
 
86
                        $gen = OIDplusAuthContentStoreJWT::JWT_GENERATOR_AJAX;
87
                        $sub = $ra_email;
88
 
89
                        $authSimulation = new OIDplusAuthContentStoreJWT();
90
                        $authSimulation->raLogin($ra_email);
91
                        $authSimulation->setValue('oidplus_generator', $gen);
92
                        $token = $authSimulation->getJWTToken();
93
 
94
                        $out['text'] .= '<p>'._L('You can make automated calls to your OIDplus account by calling the AJAX API.').'</p>';
95
                        $out['text'] .= '<p>'._L('The URL for the AJAX script is:').'</p>';
801 daniel-mar 96
                        $out['text'] .= '<p><b>'.OIDplus::webpath(null,OIDplus::PATH_ABSOLUTE_CANONICAL).'ajax.php</b></p>';
635 daniel-mar 97
                        $out['text'] .= '<p>'._L('You must at least provide following fields:').'</p>';
1265 daniel-mar 98
                        $out['text'] .= '<p><pre id="oidplus_auth_jwt">';
1264 daniel-mar 99
                        $out['text'] .= htmlentities(OIDplusAuthContentStoreJWT::COOKIE_NAME).' = "'.htmlentities($token).'"'."\n";
635 daniel-mar 100
                        $out['text'] .= '</pre></p>';
876 daniel-mar 101
                        $out['text'] .= '<p><input type="button" value="'._L('Copy to clipboard').'" onClick="copyToClipboard(oidplus_auth_jwt)"></p>';
635 daniel-mar 102
                        $out['text'] .= '<p>'._L('Please keep this information confidential!').'</p>';
103
                        $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>';
104
                        $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>';
105
 
106
                        $out['text'] .= '<h2>'._L('Blacklisted tokens').'</h2>';
107
                        $bl_time = OIDplusAuthContentStoreJWT::jwtGetBlacklistTime($gen, $sub);
108
                        if ($bl_time == 0) {
109
                                $out['text'] .= '<p>'._L('None of the previously generated JWT tokens have been blacklisted.').'</p>';
110
                        } else {
111
                                $out['text'] .= '<p>'._L('All tokens generated before %1 have been blacklisted.',date('d F Y, H:i:s',$bl_time+1)).'</p>';
112
                        }
113
                        $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>';
114
 
115
                        $out['text'] .= '<h2>'._L('Example for adding OID 2.999.123 using JavaScript').'</h2>';
116
                        $cont = file_get_contents(__DIR__.'/examples/example_js.html');
802 daniel-mar 117
                        $cont = str_replace('<url>', OIDplus::webpath(null,OIDplus::PATH_ABSOLUTE_CANONICAL).'ajax.php', $cont);
635 daniel-mar 118
                        $cont = str_replace('<token>', $token, $cont);
984 daniel-mar 119
                        $out['text'] .= '<pre id="example_js">'.htmlentities($cont).'</pre>';
120
                        $out['text'] .= '<p><input type="button" value="'._L('Copy to clipboard').'" onClick="copyToClipboard(example_js)"></p>';
635 daniel-mar 121
 
122
                        $out['text'] .= '<h2>'._L('Example for adding OID 2.999.123 using PHP (located at a foreign server)').'</h2>';
123
                        $cont = file_get_contents(__DIR__.'/examples/example_php.phps');
802 daniel-mar 124
                        $cont = str_replace('<url>', OIDplus::webpath(null,OIDplus::PATH_ABSOLUTE_CANONICAL).'ajax.php', $cont);
635 daniel-mar 125
                        $cont = str_replace('<token>', $token, $cont);
984 daniel-mar 126
                        $out['text'] .= '<pre id="example_php">'.preg_replace("@<br.*>@ismU","",highlight_string($cont,true)).'</pre>';
127
                        $out['text'] .= '<p><input type="button" value="'._L('Copy to clipboard').'" onClick="copyToClipboard(example_php)"></p>';
635 daniel-mar 128
 
129
                        $out['text'] .= '<h2>'._L('Example for adding OID 2.999.123 using Python').'</h2>';
130
                        $cont = file_get_contents(__DIR__.'/examples/example_python.py');
802 daniel-mar 131
                        $cont = str_replace('<url>', OIDplus::webpath(null,OIDplus::PATH_ABSOLUTE_CANONICAL).'ajax.php', $cont);
635 daniel-mar 132
                        $cont = str_replace('<token>', $token, $cont);
984 daniel-mar 133
                        $out['text'] .= '<pre id="example_python">'.htmlentities($cont).'</pre>';
134
                        $out['text'] .= '<p><input type="button" value="'._L('Copy to clipboard').'" onClick="copyToClipboard(example_python)"></p>';
635 daniel-mar 135
 
136
                        $out['text'] .= '<h2>'._L('Example for adding OID 2.999.123 using VBScript').'</h2>';
137
                        $cont = file_get_contents(__DIR__.'/examples/example_vbs.vbs');
802 daniel-mar 138
                        $cont = str_replace('<url>', OIDplus::webpath(null,OIDplus::PATH_ABSOLUTE_CANONICAL).'ajax.php', $cont);
635 daniel-mar 139
                        $cont = str_replace('<token>', $token, $cont);
984 daniel-mar 140
                        $out['text'] .= '<pre id="example_vbs">'.htmlentities($cont).'</pre>';
141
                        $out['text'] .= '<p><input type="button" value="'._L('Copy to clipboard').'" onClick="copyToClipboard(example_vbs)"></p>';
635 daniel-mar 142
                }
143
        }
144
 
1116 daniel-mar 145
        /**
146
         * @param array $json
147
         * @param string|null $ra_email
148
         * @param bool $nonjs
149
         * @param string $req_goto
150
         * @return bool
151
         * @throws OIDplusException
152
         */
153
        public function tree(array &$json, string $ra_email=null, bool $nonjs=false, string $req_goto=''): bool {
635 daniel-mar 154
                if (!$ra_email) return false;
155
                if (!OIDplus::authUtils()->isRaLoggedIn($ra_email) && !OIDplus::authUtils()->isAdminLoggedIn()) return false;
156
 
800 daniel-mar 157
                if (file_exists(__DIR__.'/img/main_icon16.png')) {
801 daniel-mar 158
                        $tree_icon = OIDplus::webpath(__DIR__,OIDplus::PATH_RELATIVE).'img/main_icon16.png';
635 daniel-mar 159
                } else {
160
                        $tree_icon = null; // default icon (folder)
161
                }
162
 
163
                $json[] = array(
164
                        'id' => 'oidplus:automated_ajax_information_ra$'.$ra_email,
165
                        'icon' => $tree_icon,
166
                        'text' => _L('Automated AJAX calls')
167
                );
168
 
169
                return true;
170
        }
171
 
1116 daniel-mar 172
        /**
173
         * @param string $request
174
         * @return array|false
175
         */
176
        public function tree_search(string $request) {
635 daniel-mar 177
                return false;
178
        }
179
}