18 use Symfony\Component\HttpFoundation\JsonResponse;
19 use Symfony\Component\HttpFoundation\Request;
20 use Symfony\Component\HttpFoundation\Response;
24 const NAME =
"ajax_sh_browser";
26 private $uploadtree_tablename =
"";
44 protected $agentNames = array(
'softwareHeritage' =>
'SH');
46 public function __construct()
48 parent::__construct(self::NAME, array(
49 self::TITLE => _(
"Ajax: File Browser"),
50 self::DEPENDENCIES => array(
"fileBrowse"),
52 self::REQUIRES_LOGIN =>
false
55 $this->uploadDao = $this->
getObject(
'dao.upload');
56 $this->licenseDao = $this->
getObject(
'dao.license');
57 $this->agentDao = $this->
getObject(
'dao.agent');
58 $this->shDao = $this->container->get(
'dao.softwareHeritage');
59 $sysconfig = $GLOBALS[
'SysConf'][
'SYSCONFIG'];
60 $this->configuration = [
61 'url' =>
trim($sysconfig[
'SwhURL']),
62 'uri' =>
trim($sysconfig[
'SwhBaseURL']),
63 'content' =>
trim($sysconfig[
'SwhContent']),
64 'maxtime' => intval($sysconfig[
'SwhSleep']),
65 'token' =>
trim($sysconfig[
'SwhToken'])
73 public function handle(Request $request)
75 $upload = intval($request->get(
"upload"));
76 $groupId = Auth::getGroupId();
77 if (!$this->uploadDao->isAccessible($upload, $groupId)) {
78 throw new \Exception(
"Permission Denied");
81 $item = intval($request->get(
"item"));
84 $left = $itemTreeBounds->getLeft();
86 throw new \Exception(
"Job unpack/adj2nest hasn't completed.");
89 $scannerAgents = array_keys($this->agentNames);
90 $scanJobProxy =
new ScanJobProxy($this->agentDao, $upload);
91 $scanJobProxy->createAgentStatus($scannerAgents);
92 $selectedAgentId = intval($request->get(
'agentId'));
93 $tag_pk = intval($request->get(
'tag'));
95 $UniqueTagArray = array();
96 $this->licenseProjector =
new LicenseMap($this->
getObject(
'db.manager'),$groupId,LicenseMap::CONCLUSION,
true);
97 $vars = $this->
createFileListing($tag_pk, $itemTreeBounds, $UniqueTagArray, $selectedAgentId, $groupId, $scanJobProxy, $request);
99 return new JsonResponse(array(
100 'sEcho' => intval($request->get(
'sEcho')),
101 'aaData' => $vars[
'fileData'],
102 'iTotalRecords' => $vars[
'iTotalDisplayRecords'],
103 'iTotalDisplayRecords' => $vars[
'iTotalDisplayRecords']
118 if (!empty($selectedAgentId)) {
119 $agentName = $this->agentDao->getAgentName($selectedAgentId);
120 $selectedScanners = array($agentName=>$selectedAgentId);
122 $selectedScanners = $scanJobProxy->getLatestSuccessfulAgentIds();
127 $isFlat = isset($_GET[
'flatten']);
130 $options = array(UploadTreeProxy::OPT_RANGE => $itemTreeBounds);
133 UploadTreeProxy::OPT_ITEM_FILTER =>
"AND ut.ufile_mode & (1<<28) = 0 AND ut.realparent=" . $itemTreeBounds->
getItemId()
137 $searchMap = array();
138 foreach (explode(
' ',$request->get(
'sSearch')) as $pair) {
139 $a = explode(
':',$pair);
140 if (count($a) == 1) {
141 $searchMap[
'head'] = $pair;
143 $searchMap[$a[0]] = $a[1];
147 if (array_key_exists(
'ext', $searchMap) && strlen($searchMap[
'ext'])>=1) {
148 $options[UploadTreeProxy::OPT_EXT] = $searchMap[
'ext'];
150 if (array_key_exists(
'head', $searchMap) && strlen($searchMap[
'head'])>=1) {
151 $options[UploadTreeProxy::OPT_HEAD] = $searchMap[
'head'];
156 $vars[
'iTotalDisplayRecords'] = $descendantView->count();
158 $columnNamesInDatabase = array($isFlat?
'ufile_name':
'lft');
159 $defaultOrder = array(array(0,
"asc"));
160 $orderString = $this->
getObject(
'utils.data_tables_utility')->getSortingString($_GET, $columnNamesInDatabase, $defaultOrder);
165 $orderString .=
" OFFSET $offset";
168 $orderString .=
" LIMIT $limit";
172 $sql = $descendantView->getDbViewQuery().
" $orderString";
173 $dbManager = $this->
getObject(
'db.manager');
175 $dbManager->prepare($stmt=__METHOD__.$orderString,$sql);
176 $res = $dbManager->execute($stmt,$descendantView->getParams());
177 $descendants = $dbManager->fetchAll($res);
178 $dbManager->freeResult($res);
181 if (!empty($tagId)) {
184 if (empty($descendants)) {
185 $vars[
'fileData'] = array();
190 $firstChild = reset($descendants);
191 $lastChild = end($descendants);
192 $nameRange = array($firstChild[
'ufile_name'],$lastChild[
'ufile_name']);
194 $nameRange = array();
198 $pfileLicenses = array();
199 foreach ($selectedScanners as $agentName=>$agentId) {
200 $licensePerPfile = $this->licenseDao->getLicenseIdPerPfileForAgentId($itemTreeBounds, $agentId, $isFlat, $nameRange);
201 foreach ($licensePerPfile as $pfile => $licenseRow) {
202 foreach ($licenseRow as $licId => $row) {
203 $lic = $this->licenseProjector->getProjectedShortname($licId);
204 $pfileLicenses[$pfile][$lic][$agentName] = $row;
211 $tableData = array();
212 $latestSuccessfulAgentIds = $scanJobProxy->getLatestSuccessfulAgentIds();
213 foreach ($descendants as $child) {
218 $baseUri, $UniqueTagArray, $isFlat);
221 $vars[
'fileData'] = $tableData;
234 private function createFileDataRow($child, $uploadId, $selectedAgentId, $uri, &$UniqueTagArray, $isFlat)
236 $fileId = $child[
'pfile_fk'];
237 $childUploadTreeId = $child[
'uploadtree_pk'];
239 if (!empty($fileId)) {
241 $linkUri .=
"?mod=view-license&upload=$uploadId&item=$childUploadTreeId";
242 if ($selectedAgentId) {
243 $linkUri .=
"&agentId=$selectedAgentId";
249 if ($isContainer && !$isFlat) {
250 $uploadtree_pk = $child[
'uploadtree_pk'];
251 $linkUri =
"$uri&item=" . $uploadtree_pk;
252 if ($selectedAgentId) {
253 $linkUri .=
"&agentId=$selectedAgentId";
255 }
else if ($isContainer) {
257 $linkUri =
"$uri&item=" . $uploadtree_pk;
258 if ($selectedAgentId) {
259 $linkUri .=
"&agentId=$selectedAgentId";
265 $fileName = htmlspecialchars($child[
'ufile_name']);
267 $fileName =
"<a href='$linkUri'><span style='color: darkblue'> <b>$fileName</b> </span></a>";
268 }
else if (! empty($linkUri)) {
269 $fileName =
"<a href='$linkUri'>$fileName</a>";
276 $child[
'uploadtree_pk'],
282 $shRecord = $this->shDao->getAggregatedSWHRecord($childBounds);
283 return [$fileName,
"", $shRecord[
"license"], $shRecord[
"img"], $fileListLinks];
286 $pfileHash = $this->uploadDao->getUploadHashesFromPfileId($fileId);
287 $shRecord = $this->shDao->getSoftwareHetiageRecord($fileId);
289 $text = _(
"Software Heritage");
290 $shLink = $this->configuration[
'url'] .
291 $this->configuration[
'uri'] . strtolower($pfileHash[
"sha256"]) .
292 $this->configuration[
'content'];
293 $fileListLinks .=
"[<a href='".$shLink.
"' target=\"_blank\">$text</a>]";
295 return [$fileName, $pfileHash[
"sha256"], $shRecord[
"license"], $shRecord[
"img"], $fileListLinks];
char * uploadtree_tablename
upload.uploadtree_tablename
createFileDataRow($child, $uploadId, $selectedAgentId, $uri, &$UniqueTagArray, $isFlat)
createFileListing($tagId, ItemTreeBounds $itemTreeBounds, &$UniqueTagArray, $selectedAgentId, $groupId, $scanJobProxy, $request)
Contains the constants and helpers for authentication of user.
Wrapper class for license map.
DirGetNonArtifact($UploadtreePk, $uploadtree_tablename='uploadtree')
Given an artifact directory (uploadtree_pk), return the first non-artifact directory (uploadtree_pk).
FileListLinks($upload_fk, $uploadtree_pk, $napk, $pfile_pk, $Recurse=True, &$UniqueTagArray=array(), $uploadtree_tablename="uploadtree", $wantTags=true)
Get list of links: [View][Info][Download]
Traceback_uri()
Get the URI without query to this location.
GetParm($parameterName, $parameterType)
This function will retrieve the variables and check data types.
Traceback_parm_keep($List)
Create a new URI, keeping only these items.
char * trim(char *ptext)
Trimming whitespace.
#define PERM_READ
Read-only permission.