Subversion Repositories oidplus

Rev

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