FOSSology  4.7.0-rc1
Open Source License Compliance by Open Source Software
ajax-acknowledgement-conf.php
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2026 Siemens AG
4 
5  SPDX-License-Identifier: GPL-2.0-only
6 */
7 
12 use Symfony\Component\HttpFoundation\JsonResponse;
13 use Symfony\Component\HttpFoundation\Response;
14 
20 {
22  private $uploadDao;
23 
25  private $dbManager;
26 
27  function __construct()
28  {
29  $this->Name = "ajax-acknowledgement-conf";
30  $this->Title = _("Ajax Acknowledgement Configuration");
31  $this->DBaccess = PLUGIN_DB_WRITE;
32  $this->OutputType = 'JSON';
33  $this->LoginFlag = 0;
34  parent::__construct();
35  $this->uploadDao = $GLOBALS['container']->get('dao.upload');
36  $this->dbManager = $GLOBALS['container']->get('db.manager');
37  }
38 
39  function PostInitialize()
40  {
41  $this->State = PLUGIN_STATE_READY;
42  return $this->State;
43  }
44 
45  function Output()
46  {
47  $action = GetParm("action", PARM_STRING);
48  $uploadId = GetParm("upload", PARM_INTEGER);
49  $groupId = Auth::getGroupId();
50 
51  if (!$this->uploadDao->isAccessible($uploadId, $groupId)) {
52  return new Response('Permission denied', Response::HTTP_FORBIDDEN,
53  array('Content-type' => 'text/plain'));
54  }
55 
56  switch ($action) {
57  case "getFiles":
58  return $this->doGetFiles($uploadId, $groupId);
59  case "updateAcknowledgement":
60  case "deleteAcknowledgement":
61  if (!$this->uploadDao->isEditable($uploadId, $groupId)) {
62  return new Response('Permission denied', Response::HTTP_FORBIDDEN,
63  array('Content-type' => 'text/plain'));
64  }
65  if ($action === "updateAcknowledgement") {
66  return $this->doUpdateAcknowledgement($uploadId, $groupId);
67  }
68  return $this->doDeleteAcknowledgement($uploadId, $groupId);
69  default:
70  return new Response('Unknown action', Response::HTTP_BAD_REQUEST,
71  array('Content-type' => 'text/plain'));
72  }
73  }
74 
79  private function latestValidDecisionCte($uploadTreeTable)
80  {
81  return "WITH latest_valid_decision AS (
82  SELECT DISTINCT ON (ut.uploadtree_pk)
83  cd.clearing_decision_pk AS decision_id,
84  ut.uploadtree_pk,
85  ut.ufile_name,
86  cd.decision_type
87  FROM clearing_decision cd
88  INNER JOIN $uploadTreeTable ut ON ut.uploadtree_pk = cd.uploadtree_fk
89  WHERE cd.decision_type != \$1
90  AND cd.group_fk = \$2
91  AND ut.upload_fk = \$3
92  ORDER BY ut.uploadtree_pk, cd.clearing_decision_pk DESC
93  )";
94  }
95 
103  private function cteParams($groupId, $uploadId, $ackText)
104  {
105  return array(
106  DecisionTypes::WIP,
107  $groupId,
108  $uploadId,
109  DecisionTypes::IRRELEVANT,
110  $ackText
111  );
112  }
113 
120  private function doGetFiles($uploadId, $groupId)
121  {
122  $ackText = GetParm("ack", PARM_RAW);
123  $uploadTreeTable = $this->uploadDao->getUploadtreeTableName($uploadId);
124  $cte = $this->latestValidDecisionCte($uploadTreeTable);
125 
126  $sql = "$cte
127  SELECT DISTINCT lvd.uploadtree_pk, lvd.ufile_name
128  FROM latest_valid_decision lvd
129  INNER JOIN clearing_decision_event cde
130  ON cde.clearing_decision_fk = lvd.decision_id
131  INNER JOIN clearing_event ce
132  ON ce.clearing_event_pk = cde.clearing_event_fk
133  WHERE lvd.decision_type != \$4
134  AND ce.acknowledgement = \$5
135  AND (ce.removed IS NULL OR ce.removed = FALSE)
136  ORDER BY lvd.ufile_name";
137 
138  $rows = $this->dbManager->getRows($sql,
139  $this->cteParams($groupId, $uploadId, $ackText),
140  __METHOD__ . $uploadTreeTable);
141 
142  $tracebackUri = Traceback_uri();
143  $files = array();
144  foreach ($rows as $row) {
145  $files[] = array(
146  'uploadtree_pk' => (int) $row['uploadtree_pk'],
147  'name' => $row['ufile_name'],
148  'url' => $tracebackUri . '?mod=view-license&upload=' . $uploadId
149  . '&item=' . $row['uploadtree_pk']
150  );
151  }
152  return new JsonResponse($files);
153  }
154 
161  private function doUpdateAcknowledgement($uploadId, $groupId)
162  {
163  $oldAck = GetParm("oldAck", PARM_RAW);
164  $newAck = GetParm("newAck", PARM_RAW);
165  $uploadTreeTable = $this->uploadDao->getUploadtreeTableName($uploadId);
166  $cte = $this->latestValidDecisionCte($uploadTreeTable);
167 
168  $sql = "$cte
169  UPDATE clearing_event SET acknowledgement = \$6
170  WHERE clearing_event_pk IN (
171  SELECT ce.clearing_event_pk
172  FROM latest_valid_decision lvd
173  INNER JOIN clearing_decision_event cde
174  ON cde.clearing_decision_fk = lvd.decision_id
175  INNER JOIN clearing_event ce
176  ON ce.clearing_event_pk = cde.clearing_event_fk
177  WHERE lvd.decision_type != \$4
178  AND ce.acknowledgement = \$5
179  AND (ce.removed IS NULL OR ce.removed = FALSE)
180  )";
181 
182  $params = $this->cteParams($groupId, $uploadId, $oldAck);
183  $params[] = $newAck;
184 
185  $stmt = __METHOD__ . $uploadTreeTable;
186  $this->dbManager->prepare($stmt, $sql);
187  $res = $this->dbManager->execute($stmt, $params);
188  $this->dbManager->freeResult($res);
189 
190  $countSql = "$cte
191  SELECT COUNT(DISTINCT lvd.uploadtree_pk) AS cnt
192  FROM latest_valid_decision lvd
193  INNER JOIN clearing_decision_event cde
194  ON cde.clearing_decision_fk = lvd.decision_id
195  INNER JOIN clearing_event ce
196  ON ce.clearing_event_pk = cde.clearing_event_fk
197  WHERE lvd.decision_type != \$4
198  AND ce.acknowledgement = \$5
199  AND (ce.removed IS NULL OR ce.removed = FALSE)";
200  $countRow = $this->dbManager->getSingleRow($countSql,
201  $this->cteParams($groupId, $uploadId, $newAck),
202  __METHOD__ . 'Count' . $uploadTreeTable);
203 
204  return new JsonResponse(array('status' => 'success', 'count' => (int) $countRow['cnt']));
205  }
206 
213  private function doDeleteAcknowledgement($uploadId, $groupId)
214  {
215  $ackText = GetParm("ack", PARM_RAW);
216  $uploadTreeTable = $this->uploadDao->getUploadtreeTableName($uploadId);
217  $cte = $this->latestValidDecisionCte($uploadTreeTable);
218 
219  $sql = "$cte
220  UPDATE clearing_event SET acknowledgement = ''
221  WHERE clearing_event_pk IN (
222  SELECT ce.clearing_event_pk
223  FROM latest_valid_decision lvd
224  INNER JOIN clearing_decision_event cde
225  ON cde.clearing_decision_fk = lvd.decision_id
226  INNER JOIN clearing_event ce
227  ON ce.clearing_event_pk = cde.clearing_event_fk
228  WHERE lvd.decision_type != \$4
229  AND ce.acknowledgement = \$5
230  AND (ce.removed IS NULL OR ce.removed = FALSE)
231  )";
232 
233  $stmt = __METHOD__ . $uploadTreeTable;
234  $this->dbManager->prepare($stmt, $sql);
235  $res = $this->dbManager->execute($stmt,
236  $this->cteParams($groupId, $uploadId, $ackText));
237  $this->dbManager->freeResult($res);
238 
239  return new JsonResponse(array('status' => 'success'));
240  }
241 }
242 
243 $NewPlugin = new AjaxAcknowledgementConf();
244 $NewPlugin->Initialize();
AJAX handler for acknowledgement operations on report-conf page.
doUpdateAcknowledgement($uploadId, $groupId)
Update acknowledgement text on the clearing_event records.
__construct()
base constructor. Most plugins will just use this
cteParams($groupId, $uploadId, $ackText)
Return Common params array for the query.
Output()
This function is called when user output is requested. This function is responsible for content....
doDeleteAcknowledgement($uploadId, $groupId)
Clear acknowledgement from the clearing_event records.
latestValidDecisionCte($uploadTreeTable)
doGetFiles($uploadId, $groupId)
Return files containing a given acknowledgement text for an upload.
PostInitialize()
This function is called before the plugin is used and after all plugins have been initialized....
This is the Plugin class. All plugins should:
Definition: FO_Plugin.php:57
Contains the constants and helpers for authentication of user.
Definition: Auth.php:24
Definition: state.hpp:16
Traceback_uri()
Get the URI without query to this location.
Definition: common-parm.php:97
const PARM_INTEGER
Definition: common-parm.php:14
const PARM_RAW
Definition: common-parm.php:22
const PARM_STRING
Definition: common-parm.php:18
GetParm($parameterName, $parameterType)
This function will retrieve the variables and check data types.
Definition: common-parm.php:46
#define PLUGIN_DB_WRITE
Plugin requires write permission on DB.
Definition: libfossology.h:38
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16