FOSSology  4.6.0-rc1
Open Source License Compliance by Open Source Software
readmeoss.php
Go to the documentation of this file.
1 <?php
2 /*
3  Author: Daniele Fognini, Shaheem Azmal M MD
4  SPDX-FileCopyrightText: © 2016-2018 Siemens AG
5 
6  SPDX-License-Identifier: GPL-2.0-only
7 */
45 
46 include_once(__DIR__ . "/version.php");
47 
53 class ReadmeOssAgent extends Agent
54 {
55  const UPLOAD_ADDS = "uploadsAdd";
56 
61 
66 
71 
75  private $reportutils;
76 
80  private $uploadDao;
81 
85  protected $additionalUploadIds = array();
86 
87  function __construct()
88  {
89  $this->cpClearedGetter = new XpClearedGetter("copyright", "statement");
90  $this->licenseClearedGetter = new LicenseClearedGetter();
91  $this->licenseMainGetter = new LicenseMainGetter();
92  $this->reportutils = new ReportUtils();
93 
94  parent::__construct(README_AGENT_NAME, AGENT_VERSION, AGENT_REV);
95 
96  $this->uploadDao = $this->container->get('dao.upload');
97 
98  $this->agentSpecifLongOptions[] = self::UPLOAD_ADDS.':';
99  }
100 
106  function processUploadId($uploadId)
107  {
109 
110  $args = $this->args;
111  $this->additionalUploadIds = array_key_exists(self::UPLOAD_ADDS,$args) ? explode(',',$args[self::UPLOAD_ADDS]) : array();
112  $uploadIds = $this->additionalUploadIds;
113  array_unshift($uploadIds, $uploadId);
114 
115  $this->heartbeat(0);
116  $licenseStmts = array();
117  $copyrightStmts = array();
118  $licenseStmtsMain = array();
119  $licenseAcknowledgements = array();
120 
121  foreach ($uploadIds as $addUploadId) {
122  if (!$this->uploadDao->isAccessible($addUploadId, $groupId)) {
123  continue;
124  }
125  $moreLicenses = $this->licenseClearedGetter->getCleared($addUploadId, $this, $groupId, true, "license", false);
126  $licenseStmts = array_merge($licenseStmts, $moreLicenses['statements']);
127  $this->heartbeat(count($moreLicenses['statements']));
128  $this->licenseClearedGetter->setOnlyAcknowledgements(true);
129  $moreAcknowledgements = $this->licenseClearedGetter->getCleared($addUploadId, $this, $groupId, true, "license", false);
130  $licenseAcknowledgements = array_merge($licenseAcknowledgements, $moreAcknowledgements['statements']);
131  $this->heartbeat(count($moreAcknowledgements['statements']));
132  $moreCopyrights = $this->cpClearedGetter->getCleared($addUploadId, $this, $groupId, true, "copyright", false);
133  $copyrightStmts = array_merge($copyrightStmts, $moreCopyrights['statements']);
134  $this->heartbeat(count($moreCopyrights['statements']));
135  $moreMainLicenses = $this->licenseMainGetter->getCleared($addUploadId, $this, $groupId, true, null, false);
136  $licenseStmtsMain = array_merge($licenseStmtsMain, $moreMainLicenses['statements']);
137  $this->heartbeat(count($moreMainLicenses['statements']));
138  }
139  list($licenseStmtsMain, $licenseStmts) = $this->licenseClearedGetter->updateIdentifiedGlobalLicenses($licenseStmtsMain, $licenseStmts);
140  $contents = array('licensesMain'=>$licenseStmtsMain, 'licenses'=>$licenseStmts, 'copyrights'=>$copyrightStmts, 'licenseAcknowledgements' => $licenseAcknowledgements);
141  $this->writeReport($contents, $uploadId);
142 
143  return true;
144  }
145 
151  private function writeReport($contents, $uploadId)
152  {
153  global $SysConf;
154 
155  $packageName = $this->uploadDao->getUpload($uploadId)->getFilename();
156 
157  $fileBase = $SysConf['FOSSOLOGY']['path']."/report/";
158  $fileName = $fileBase. "ReadMe_OSS_".$packageName.".txt" ;
159 
160  foreach ($this->additionalUploadIds as $addUploadId) {
161  $packageName .= ', ' . $this->uploadDao->getUpload($addUploadId)->getFilename();
162  }
163 
164  if (!is_dir($fileBase)) {
165  mkdir($fileBase, 0777, true);
166  }
167  umask(0133);
168  $message = $this->generateReport($contents, $packageName, $uploadId);
169 
170  file_put_contents($fileName, $message);
171 
172  $this->updateReportTable($uploadId, $this->jobId, $fileName);
173  }
174 
181  private function updateReportTable($uploadId, $jobId, $filename)
182  {
183  $this->reportutils->updateOrInsertReportgenEntry($uploadId, $jobId, $filename);
184  }
185 
194  private function createReadMeOSSFormat($addSeparator, $dataForReadME, $extract, $break, $uploadId)
195  {
196  $outData = "";
197  $row = $this->uploadDao->getReportInfo($uploadId);
198  $selections = [];
199  if (!empty($row['ri_spdx_selection'])) {
200  $selections = explode(',', $row['ri_spdx_selection']);
201  }
202  $osselotEnabled = (
203  isset($selections[2]) &&
204  trim($selections[2]) === 'checked'
205  );
206  foreach ($dataForReadME as $statements) {
207  if ($extract == 'text') {
208  $licenseLine = $statements["content"];
209  if ($osselotEnabled) {
210  $licenseLine = str_replace(LicenseRef::SPDXREF_PREFIX_FOSSOLOGY, "", $licenseLine);
211  $licenseLine = str_replace(LicenseRef::SPDXREF_PREFIX, "", $licenseLine);
212  }
213  $outData .= $licenseLine . $break;
214  }
215  $outData .= str_replace("\n", "\r\n", $statements[$extract]) . $break;
216  if (!empty($addSeparator)) {
217  $outData .= $addSeparator . $break;
218  }
219  }
220  return htmlspecialchars_decode($outData, ENT_DISALLOWED);
221  }
222 
230  private function generateReport($contents, $packageName, $uploadId)
231  {
232  $separator1 = str_repeat("=", 120);
233  $separator2 = str_repeat("-", 120);
234  $break = str_repeat("\r\n", 2);
235  $output = $separator1 . $break . $packageName . $break . $separator2 . $break;
236  if (!empty($contents['licensesMain'])) {
237  $output .= $separator1 . $break . " MAIN LICENSES " . $break . $separator2 . $break;
238  $output .= $this->createReadMeOSSFormat($separator2, $contents['licensesMain'], 'text', $break, $uploadId);
239  }
240  if (!empty($contents['licenses'])) {
241  $output .= $separator1 . $break . " OTHER LICENSES " . $break . $separator2 . $break;
242  $output .= $this->createReadMeOSSFormat($separator2, $contents['licenses'], 'text', $break, $uploadId);
243  }
244  if (!empty($contents['licenseAcknowledgements'])) {
245  $output .= $separator1 . $break . " ACKNOWLEDGEMENTS " . $break . $separator2 . $break;
246  $output .= $this->createReadMeOSSFormat($separator2, $contents['licenseAcknowledgements'], 'text', $break, $uploadId);
247  }
248  $copyrights = $this->createReadMeOSSFormat("", $contents['copyrights'], 'content', "\r\n", $uploadId);
249  if (empty($copyrights)) {
250  $output .= "<Copyright notices>";
251  $output .= $break;
252  $output .= "<notices>";
253  } else {
254  $output .= "Copyright notices";
255  $output .= $break;
256  $output .= $copyrights;
257  }
258  return $output;
259  }
260 }
261 
262 $agent = new ReadmeOssAgent();
263 $agent->scheduler_connect();
264 $agent->run_scheduler_event_loop();
265 $agent->scheduler_disconnect(0);
Structure of an Agent with all required parameters.
Definition: Agent.php:41
heartbeat($newProcessed)
Send hear beat to the scheduler.
Definition: Agent.php:203
Readme_OSS agent generates list of licenses and copyrights found in an upload.
Definition: readmeoss.php:54
updateReportTable($uploadId, $jobId, $filename)
Update the report path.
Definition: readmeoss.php:181
writeReport($contents, $uploadId)
Write data to text file.
Definition: readmeoss.php:151
const UPLOAD_ADDS
The HTTP GET parameter name.
Definition: readmeoss.php:55
processUploadId($uploadId)
Given an upload ID, process the items in it.
Definition: readmeoss.php:106
createReadMeOSSFormat($addSeparator, $dataForReadME, $extract, $break, $uploadId)
This function lists elements of array.
Definition: readmeoss.php:194
generateReport($contents, $packageName, $uploadId)
Gather all the data.
Definition: readmeoss.php:230
char * trim(char *ptext)
Trimming whitespace.
Definition: fossconfig.c:690
int jobId
The id of the job.