FOSSology  4.6.0
Open Source License Compliance by Open Source Software
reuser-plugin.php
Go to the documentation of this file.
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2014-2018 Siemens AG
4 
5  SPDX-License-Identifier: GPL-2.0-only
6 */
10 namespace Fossology\Reuser;
11 
15 use Symfony\Component\HttpFoundation\JsonResponse;
16 use Symfony\Component\HttpFoundation\Request;
17 use Symfony\Component\HttpFoundation\Response;
19 
20 include_once(__DIR__ . "/../agent/version.php");
21 
27 {
28  const NAME = "plugin_reuser";
29 
30  const REUSE_FOLDER_SELECTOR_NAME = 'reuseFolderSelectorName';
31  const UPLOAD_TO_REUSE_SELECTOR_NAME = 'uploadToReuse';
32  const FOLDER_PARAMETER_NAME = 'folder';
33 
39  private function extractPackageNameFromFilename($filename)
40  {
41  if (empty($filename)) {
42  return '';
43  }
44 
45  $nameWithoutExt = preg_replace('/\.[^.]+$/', '', $filename);
46  $parts = explode('-', $nameWithoutExt);
47  $packageName = strtolower($parts[0]);
48 
49  return $packageName;
50  }
51 
55  public $AgentName = 'agent_reuser';
59  private $folderDao;
60 
61  public function __construct()
62  {
63  parent::__construct(self::NAME, array(
64  self::TITLE => _("Automatic Clearing Decision Reuser"),
65  self::PERMISSION => Auth::PERM_WRITE
66  ));
67 
68  $this->folderDao = $this->getObject('dao.folder');
69  }
70 
75  function getAllUploads()
76  {
77  $trustGroupId = Auth::getGroupId();
78  $folderUploads = $this->folderDao->getAllUploadsForGroup($trustGroupId);
79  $uploadsById = array();
80  foreach ($folderUploads as $uploadProgress) {
81  $key = $uploadProgress->getId();
82  $display = $uploadProgress->getFilename() . _(" from ")
83  . Convert2BrowserTime(date("Y-m-d H:i:s", $uploadProgress->getTimestamp()))
84  . ' (' . $uploadProgress->getStatusString() . ')';
85  $uploadsById[$key] = $display;
86  }
87  return $uploadsById;
88  }
89 
94  protected function handle(Request $request)
95  {
96  $this->folderDao->ensureTopLevelFolder();
97  $ajax = $request->get('do');
98 
99  if ($ajax === 'getUploads') {
100  list($fid, $tgid) = $this->getFolderIdAndTrustGroup($request->get(self::FOLDER_PARAMETER_NAME, ''));
101  $uploads = (empty($fid) || empty($tgid))
102  ? $this->getAllUploads()
103  : $this->prepareFolderUploads($fid, $tgid);
104  return new JsonResponse($uploads, JsonResponse::HTTP_OK);
105  }
106 
107  if ($ajax === 'getOsselotVersions') {
108  $pkg = trim($request->get('pkg', $request->get('osselotPackage', '')));
109  if ($pkg === '') {
110  return new JsonResponse([], JsonResponse::HTTP_OK);
111  }
112  $helper = new OsselotLookupHelper();
113  try {
114  $versions = $helper->getVersions($pkg);
115  } catch (\Exception $e) {
116  $versions = [];
117  }
118  return new JsonResponse($versions, JsonResponse::HTTP_OK);
119  }
120 
121  if ($ajax === 'extractPackageName') {
122  $filename = trim($request->get('filename', ''));
123  if ($filename === '') {
124  return new JsonResponse(['packageName' => ''], JsonResponse::HTTP_OK);
125  }
126 
127  $packageName = $this->extractPackageNameFromFilename($filename);
128  return new JsonResponse(['packageName' => $packageName], JsonResponse::HTTP_OK);
129  }
130 
131  return new Response('called without valid method', Response::HTTP_METHOD_NOT_ALLOWED);
132  }
133 
139  public function getFolderIdAndTrustGroup($folderGroup)
140  {
141  $folderGroupPair = explode(',', $folderGroup,2);
142  if (count($folderGroupPair) == 2) {
143  list($folder, $trustGroup) = $folderGroupPair;
144  $folderId = intval($folder);
145  $trustGroupId = intval($trustGroup);
146  } else {
147  $trustGroupId = Auth::getGroupId();
148  $folderId = 0;
149  }
150  return array($folderId, $trustGroupId);
151  }
152 
158  public function renderContent(&$vars)
159  {
160  global $SysConf;
161  $osselotAvailable = (array_key_exists('EnableOsselotReuse', $SysConf['SYSCONFIG']) && $SysConf['SYSCONFIG']["EnableOsselotReuse"] === 'true');
162  if (!array_key_exists('folderStructure', $vars)) {
163  $rootFolderId = $this->folderDao->getRootFolder(Auth::getUserId())->getId();
164  $vars['folderStructure'] = $this->folderDao->getFolderStructure($rootFolderId);
165  }
166  if ($this->folderDao->isWithoutReusableFolders($vars['folderStructure'])) {
167  return '';
168  }
169  $pair = array_key_exists(self::FOLDER_PARAMETER_NAME, $vars) ? $vars[self::FOLDER_PARAMETER_NAME] : '';
170 
171  list($folderId, $trustGroupId) = $this->getFolderIdAndTrustGroup($pair);
172  if (empty($folderId) && !empty($vars['folderStructure'])) {
173  $folderId = $vars['folderStructure'][0][FolderDao::FOLDER_KEY]->getId();
174  }
175 
176  $vars['reuseFolderSelectorName'] = self::REUSE_FOLDER_SELECTOR_NAME;
177  $vars['folderParameterName'] = self::FOLDER_PARAMETER_NAME;
178  $vars['uploadToReuseSelectorName'] = self::UPLOAD_TO_REUSE_SELECTOR_NAME;
179  $vars['folderUploads'] = $this->prepareFolderUploads($folderId, $trustGroupId);
180  $vars['osselotAvailable'] = $osselotAvailable;
181  $vars['defaultPkgName'] = '';
182  $vars['userIsAdmin'] = Auth::isAdmin();
183 
184  $renderer = $this->getObject('twig.environment');
185  return $renderer->load('agent_reuser.html.twig')->render($vars);
186  }
187 
193  public function renderFoot(&$vars)
194  {
195  global $SysConf;
196  $osselotAvailable = (array_key_exists('EnableOsselotReuse', $SysConf['SYSCONFIG']) && $SysConf['SYSCONFIG']["EnableOsselotReuse"] === 'true');
197  $vars['reuseFolderSelectorName'] = self::REUSE_FOLDER_SELECTOR_NAME;
198  $vars['folderParameterName'] = self::FOLDER_PARAMETER_NAME;
199  $vars['uploadToReuseSelectorName'] = self::UPLOAD_TO_REUSE_SELECTOR_NAME;
200  $vars['osselotAvailable'] = $osselotAvailable;
201 
202  $renderer = $this->getObject('twig.environment');
203  return $renderer->load('agent_reuser.js.twig')->render($vars);
204  }
205 
211  public function getScriptIncludes(&$vars)
212  {
213  return '<script src="scripts/tools.js" type="text/javascript"></script>';
214  }
215 
225  protected function prepareFolderUploads($folderId, $trustGroupId=null)
226  {
227  if (empty($trustGroupId)) {
228  $trustGroupId = Auth::getGroupId();
229  }
230  $folderUploads = $this->folderDao->getFolderUploads($folderId, $trustGroupId);
231 
232  $uploadsById = array();
233  foreach ($folderUploads as $uploadProgress) {
234  $key = $uploadProgress->getId().','.$uploadProgress->getGroupId();
235  $display = $uploadProgress->getFilename() . _(" from ")
236  . Convert2BrowserTime(date("Y-m-d H:i:s",$uploadProgress->getTimestamp()))
237  . ' ('. $uploadProgress->getStatusString() . ')';
238  $uploadsById[$key] = $display;
239  }
240  return $uploadsById;
241  }
242 }
243 
244 register_plugin(new ReuserPlugin());
Contains the constants and helpers for authentication of user.
Definition: Auth.php:24
static getUserId()
Get the current user's id.
Definition: Auth.php:68
static getGroupId()
Get the current user's group id.
Definition: Auth.php:80
static isAdmin()
Check if user is admin.
Definition: Auth.php:92
UI plugin for reuser.
getFolderIdAndTrustGroup($folderGroup)
For a given folder group, extract forder id and trust group id.
renderFoot(&$vars)
Render footer template.
const REUSE_FOLDER_SELECTOR_NAME
Reuse upload folder element name.
renderContent(&$vars)
Load the data in array and render twig template.
const FOLDER_PARAMETER_NAME
Folder parameter HTML element name.
prepareFolderUploads($folderId, $trustGroupId=null)
For a given folder id, collect all uploads.
getScriptIncludes(&$vars)
Render JS inclues.
getAllUploads()
Get all uploads accessible to current user.
const UPLOAD_TO_REUSE_SELECTOR_NAME
Upload to reuse HTML element name.
Convert2BrowserTime($server_time)
Convert the server time to browser time.
Definition: common-ui.php:312
char * trim(char *ptext)
Trimming whitespace.
Definition: fossconfig.c:690
list_t type structure used to keep various lists. (e.g. there are multiple lists).
Definition: nomos.h:308