Skip to content

Commit 4b4d801

Browse files
committed
fix(ldapquestion): missing files
1 parent 0a43ab8 commit 4b4d801

File tree

2 files changed

+252
-0
lines changed

2 files changed

+252
-0
lines changed

ajax/getldapvalues.php

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
/**
3+
* ---------------------------------------------------------------------
4+
* Formcreator is a plugin which allows creation of custom forms of
5+
* easy access.
6+
* ---------------------------------------------------------------------
7+
* LICENSE
8+
*
9+
* This file is part of Formcreator.
10+
*
11+
* Formcreator is free software; you can redistribute it and/or modify
12+
* it under the terms of the GNU General Public License as published by
13+
* the Free Software Foundation; either version 2 of the License, or
14+
* (at your option) any later version.
15+
*
16+
* Formcreator is distributed in the hope that it will be useful,
17+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
18+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19+
* GNU General Public License for more details.
20+
*
21+
* You should have received a copy of the GNU General Public License
22+
* along with Formcreator. If not, see <http://www.gnu.org/licenses/>.
23+
* ---------------------------------------------------------------------
24+
* @copyright Copyright © 2011 - 2021 Teclib'
25+
* @license http://www.gnu.org/licenses/gpl.txt GPLv3+
26+
* @link https://github.com/pluginsGLPI/formcreator/
27+
* @link https://pluginsglpi.github.io/formcreator/
28+
* @link http://plugins.glpi-project.org/#/plugin/formcreator
29+
* ---------------------------------------------------------------------
30+
*/
31+
32+
include ('../../../inc/includes.php');
33+
34+
if (!defined('GLPI_ROOT')) {
35+
die("Sorry. You can't access this file directly");
36+
}
37+
38+
header('Content-Type: application/json; charset=UTF-8');
39+
Html::header_nocache();
40+
41+
// Check if plugin is activated...
42+
if (!Plugin::isPluginActive('formcreator')) {
43+
Html::displayNotFoundError();
44+
}
45+
46+
Session::checkLoginUser();
47+
echo PluginFormcreatorLdapDropdown::getDropdownValue($_POST);

inc/ldapdropdown.class.php

+205
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
<?php
2+
/**
3+
* ---------------------------------------------------------------------
4+
* Formcreator is a plugin which allows creation of custom forms of
5+
* easy access.
6+
* ---------------------------------------------------------------------
7+
* LICENSE
8+
*
9+
* This file is part of Formcreator.
10+
*
11+
* Formcreator is free software; you can redistribute it and/or modify
12+
* it under the terms of the GNU General Public License as published by
13+
* the Free Software Foundation; either version 2 of the License, or
14+
* (at your option) any later version.
15+
*
16+
* Formcreator is distributed in the hope that it will be useful,
17+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
18+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19+
* GNU General Public License for more details.
20+
*
21+
* You should have received a copy of the GNU General Public License
22+
* along with Formcreator. If not, see <http://www.gnu.org/licenses/>.
23+
* ---------------------------------------------------------------------
24+
* @copyright Copyright © 2011 - 2020 Teclib'
25+
* @license http://www.gnu.org/licenses/gpl.txt GPLv3+
26+
* @link https://github.com/pluginsGLPI/formcreator/
27+
* @link https://pluginsglpi.github.io/formcreator/
28+
* @link http://plugins.glpi-project.org/#/plugin/formcreator
29+
* ---------------------------------------------------------------------
30+
*/
31+
32+
use Glpi\Toolbox\Sanitizer;
33+
34+
if (!defined('GLPI_ROOT')) {
35+
die("Sorry. You can't access this file directly");
36+
}
37+
38+
class PluginFormcreatorLdapDropdown extends CommonGLPI
39+
{
40+
public static function getTable() {
41+
return '';
42+
}
43+
44+
public function getForeignKeyField() {
45+
return '';
46+
}
47+
48+
public function isField() {
49+
return false;
50+
}
51+
52+
public static function dropdown($options = []) {
53+
$options['display'] = $options['display'] ?? false;
54+
$options['url'] = Plugin::getWebDir('formcreator') . '/ajax/getldapvalues.php';
55+
56+
$out = Dropdown::show(self::class, $options);
57+
if (!$options['display']) {
58+
return $out;
59+
}
60+
echo $out;
61+
}
62+
63+
public static function getDropdownValue($post, $json = true) {
64+
// Count real items returned
65+
$count = 0;
66+
67+
if (isset($post['condition']) && !empty($post['condition']) && !is_array($post['condition'])) {
68+
// Retreive conditions from SESSION using its key
69+
$key = $post['condition'];
70+
$post['condition'] = [];
71+
if (isset($_SESSION['glpicondition']) && isset($_SESSION['glpicondition'][$key])) {
72+
$post['condition'] = $_SESSION['glpicondition'][$key];
73+
}
74+
}
75+
76+
$questionId = $post['condition'][PluginFormcreatorQuestion::getForeignKeyField()];
77+
$question = PluginFormcreatorQuestion::getById($questionId);
78+
if (!is_object($question)) {
79+
return [];
80+
}
81+
82+
$form = new PluginFormcreatorForm();
83+
$form->getByQuestionId($questionId);
84+
if (!$form->canViewForRequest()) {
85+
return [];
86+
}
87+
$post['searchText'] = $post['searchText'] ?? '';
88+
89+
// Search values
90+
$ldap_values = json_decode($question->fields['values'], JSON_OBJECT_AS_ARRAY);
91+
$ldap_dropdown = new RuleRightParameter();
92+
if (!$ldap_dropdown->getFromDB($ldap_values['ldap_attribute'])) {
93+
return [];
94+
}
95+
$attribute = [$ldap_dropdown->fields['value']];
96+
97+
$config_ldap = new AuthLDAP();
98+
if (!$config_ldap->getFromDB($ldap_values['ldap_auth'])) {
99+
return [];
100+
}
101+
102+
set_error_handler([self::class, 'ldapErrorHandler'], E_WARNING);
103+
104+
if ($post['searchText'] != '') {
105+
$ldap_values['ldap_filter'] = sprintf(
106+
"(& %s (%s))",
107+
$ldap_values['ldap_filter'],
108+
$attribute[0] . '=*' . $post['searchText'] . '*'
109+
);
110+
}
111+
112+
$tab_values = [];
113+
try {
114+
$cookie = '';
115+
$ds = $config_ldap->connect();
116+
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
117+
do {
118+
if (AuthLDAP::isLdapPageSizeAvailable($config_ldap)) {
119+
if (version_compare(PHP_VERSION, '7.3') < 0) {
120+
// phpcs:ignore Generic.PHP.DeprecatedFunctions
121+
ldap_control_paged_result($ds, $config_ldap->fields['pagesize'], true, $cookie);
122+
$result = ldap_search($ds, $config_ldap->fields['basedn'], $ldap_values->ldap_filter, $attribute);
123+
} else {
124+
$controls = [
125+
[
126+
'oid' => LDAP_CONTROL_PAGEDRESULTS,
127+
'iscritical' => true,
128+
'value' => [
129+
'size' => $config_ldap->fields['pagesize'],
130+
'cookie' => $cookie
131+
]
132+
]
133+
];
134+
$result = ldap_search($ds, $config_ldap->fields['basedn'], $ldap_values['ldap_filter'], $attribute, 0, -1, -1, LDAP_DEREF_NEVER, $controls);
135+
ldap_parse_result($ds, $result, $errcode, $matcheddn, $errmsg, $referrals, $controls);
136+
$cookie = $controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'] ?? '';
137+
}
138+
} else {
139+
$result = ldap_search($ds, $config_ldap->fields['basedn'], $ldap_values['ldap_filter'], $attribute);
140+
}
141+
142+
$entries = ldap_get_entries($ds, $result);
143+
// openldap return 4 for Size limit exceeded
144+
$limitexceeded = in_array(ldap_errno($ds), [4, 11]);
145+
146+
if ($limitexceeded) {
147+
Session::addMessageAfterRedirect(__('LDAP size limit exceeded', 'formcreator'), true, WARNING);
148+
}
149+
150+
unset($entries['count']);
151+
152+
$foundCount = 0;
153+
foreach ($entries as $attr) {
154+
if (!isset($attr[$attribute[0]]) || in_array($attr[$attribute[0]][0], $tab_values)) {
155+
continue;
156+
}
157+
158+
$foundCount++;
159+
if ($foundCount < ((int) $post['page'] - 1) * (int) $post['page_limit'] + 1) {
160+
// before the requested page
161+
continue;
162+
}
163+
if ($foundCount > ((int) $post['page']) * (int) $post['page_limit']) {
164+
// after the requested page
165+
break;
166+
}
167+
168+
$tab_values[] = [
169+
'id' => $attr[$attribute[0]][0],
170+
'text' => $attr[$attribute[0]][0],
171+
];
172+
$count++;
173+
if ($count >= $post['page_limit']) {
174+
break;
175+
}
176+
}
177+
if (AuthLDAP::isLdapPageSizeAvailable($config_ldap) && version_compare(PHP_VERSION, '7.3') < 0) {
178+
// phpcs:ignore Generic.PHP.DeprecatedFunctions
179+
ldap_control_paged_result_response($ds, $result, $cookie);
180+
}
181+
} while ($cookie !== null && $cookie != '' && $count < $post['page_limit']);
182+
} catch (Exception $e) {
183+
restore_error_handler();
184+
trigger_error($e->getMessage(), E_USER_WARNING);
185+
}
186+
187+
restore_error_handler();
188+
189+
$tab_values = Html::entities_deep($tab_values);
190+
usort($tab_values, function($a, $b) {
191+
return strnatcmp($a['text'], $b['text']);
192+
});
193+
$ret['results'] = $tab_values;
194+
$ret['count'] = $count;
195+
196+
return ($json === true) ? json_encode($ret) : $ret;
197+
}
198+
199+
public static function ldapErrorHandler($errno, $errstr, $errfile, $errline) {
200+
if (0 === error_reporting()) {
201+
return false;
202+
}
203+
throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
204+
}
205+
}

0 commit comments

Comments
 (0)