Skip to content

Commit 8c82f99

Browse files
trashercedric-anne
andauthored
Own route to inventory refused equipments (#18370)
* Use own controller for refused equipments re-inventory * Do not rely on get data * Cleanup * No need for 2 distinct controllers here * Update src/Glpi/Controller/InventoryController.php Co-authored-by: Cédric Anne <[email protected]> * Ignore false phpstan issue * fix forward --------- Co-authored-by: Cédric Anne <[email protected]>
1 parent 4103dc5 commit 8c82f99

File tree

3 files changed

+55
-33
lines changed

3 files changed

+55
-33
lines changed

src/Glpi/Controller/IndexController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public function __invoke(Request $request): Response
7474
) {
7575
// POST request from the inventory agent, forward it to the inventory controller.
7676
$sub_request = $request->duplicate(
77-
attributes: ['_controller' => InventoryController::class]
77+
attributes: ['_controller' => InventoryController::class . '::index']
7878
);
7979
return $this->http_kernel->handle($sub_request, HttpKernelInterface::SUB_REQUEST);
8080
}

src/Glpi/Controller/InventoryController.php

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ final class InventoryController extends AbstractController
5050
#[SecurityStrategy(Firewall::STRATEGY_NO_CHECK)]
5151
#[Route("/Inventory", name: "glpi_inventory", methods: ['GET', 'POST'])]
5252
#[Route("/front/inventory.php", name: "glpi_inventory_legacy", methods: ['GET', 'POST'])]
53-
public function __invoke(Request $request): Response
53+
public function index(Request $request): Response
5454
{
5555
$conf = new Conf();
5656
if ($conf->enabled_inventory != 1) {
@@ -59,25 +59,13 @@ public function __invoke(Request $request): Response
5959

6060
$inventory_request = new \Glpi\Inventory\Request();
6161
$inventory_request->handleHeaders();
62-
$refused_id = $request->get('refused');
6362

6463
self::$is_running = true;
65-
$refused = new \RefusedEquipment();
6664

6765
try {
6866
$handle = true;
6967
$contents = '';
70-
if ($refused_id) {
71-
\Session::checkRight("config", READ);
72-
if ($refused->getFromDB($refused_id) && ($inventory_file = $refused->getInventoryFileName()) !== null) {
73-
$contents = file_get_contents($inventory_file);
74-
} else {
75-
throw new HttpException(
76-
404,
77-
sprintf('Invalid RefusedEquipment "%s" or inventory file missing', $refused_id)
78-
);
79-
}
80-
} else if (!$request->isMethod('POST')) {
68+
if (!$request->isMethod('POST')) {
8169
if ($request->get('action') === 'getConfig') {
8270
/**
8371
* Even if Fusion protocol is not supported for getConfig requests, they
@@ -106,19 +94,47 @@ public function __invoke(Request $request): Response
10694

10795
$inventory_request->handleMessages();
10896

109-
if ($refused_id) {
110-
$redirect_url = $refused->handleInventoryRequest($inventory_request);
111-
$response = new RedirectResponse($redirect_url);
112-
} else {
113-
$response = new Response();
114-
$response->setStatusCode($inventory_request->getHttpResponseCode());
115-
$headers = $inventory_request->getHeaders(true);
116-
foreach ($headers as $key => $value) {
117-
$response->headers->set($key, $value);
97+
$response = new Response();
98+
$response->setStatusCode($inventory_request->getHttpResponseCode());
99+
$headers = $inventory_request->getHeaders(true);
100+
foreach ($headers as $key => $value) {
101+
$response->headers->set($key, $value);
102+
}
103+
$response->setContent($inventory_request->getResponse());
104+
return $response;
105+
}
106+
107+
#[Route("/Inventory/RefusedEquipment", name: "glpi_refused_inventory", methods: 'POST')]
108+
public function refusedEquipement(Request $request): Response
109+
{
110+
$conf = new Conf();
111+
if ($conf->enabled_inventory != 1) {
112+
throw new AccessDeniedHttpException("Inventory is disabled");
113+
}
114+
115+
$inventory_request = new \Glpi\Inventory\Request();
116+
$refused_id = (int)$request->get('id');
117+
118+
$refused = new \RefusedEquipment();
119+
120+
try {
121+
\Session::checkRight("config", READ);
122+
if ($refused->getFromDB($refused_id) && ($inventory_file = $refused->getInventoryFileName()) !== null) {
123+
$contents = file_get_contents($inventory_file);
124+
} else {
125+
throw new HttpException(
126+
404,
127+
sprintf('Invalid RefusedEquipment "%s" or inventory file missing', $refused_id)
128+
);
118129
}
119-
$response->setContent($inventory_request->getResponse());
130+
$inventory_request->handleRequest($contents);
131+
} catch (\Throwable $e) {
132+
//empty
133+
$inventory_request->addError($e->getMessage());
120134
}
121135

136+
$redirect_url = $refused->handleInventoryRequest($inventory_request);
137+
$response = new RedirectResponse($redirect_url);
122138
return $response;
123139
}
124140
}

src/Glpi/Features/Inventoriable.php

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public function pre_purgeInventory()
5555
{
5656
$file_name = $this->getInventoryFileName();
5757
if ($file_name === null) {
58-
//file does not exists
58+
//file does not exist
5959
return true;
6060
}
6161

@@ -81,7 +81,7 @@ public function getInventoryFileName(bool $prepend_dir_path = true): ?string
8181
$items_id = $this->agent->fields['items_id'] ?? $this->fields['id'];
8282

8383
$conf = new Conf();
84-
//Check for JSON file, and the XML if JSON does not exists
84+
//Check for JSON file, and the XML if JSON does not exist
8585
$filename = $conf->buildInventoryFileName($itemtype, $items_id, 'json');
8686
if (!file_exists($inventory_dir_path . $filename)) {
8787
$filename = $conf->buildInventoryFileName($itemtype, $items_id, 'xml');
@@ -134,12 +134,18 @@ protected function showInventoryInfo()
134134
\htmlescape($title)
135135
);
136136

137-
if (static::class == RefusedEquipment::class) {
138-
echo sprintf(
139-
"<a href='%s' target='_blank' style='float: right;margin-right: .5em;'><i class='fas fa-redo' title='%s'></i></a>",
140-
$CFG_GLPI['root_doc'] . '/Inventory?refused=' . $this->fields['id'],
141-
__s('Try a reimport from stored inventory file')
142-
);
137+
if (static::class === RefusedEquipment::class) { //@phpstan-ignore-line - phpstan bug with traits
138+
$url = $CFG_GLPI['root_doc'] . '/Inventory/RefusedEquipment';
139+
$title = __s('Try a reimport from stored inventory file');
140+
echo <<<HTML
141+
<button type="submit" class="btn btn-sm btn-ghost-secondary" name="redo_inventory"
142+
title="{$title}"
143+
data-bs-toggle="tooltip" data-bs-placement="top"
144+
style="float: right;margin-right: .5em;"
145+
formaction="{$url}">
146+
<i class="fas fa-redo"></i>
147+
</button>
148+
HTML;
143149
}
144150
} else {
145151
echo sprintf(

0 commit comments

Comments
 (0)