Skip to content

Commit ea71a14

Browse files
authored
Merge branch 'main' into fix/REST/removeExtraBracketsFromEmbeddedResponse
2 parents 6464459 + d8acc12 commit ea71a14

File tree

17 files changed

+248
-33
lines changed

17 files changed

+248
-33
lines changed

.github/workflows/build_and_test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ jobs:
5353

5454
steps:
5555
- name: Harden Runner
56-
uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
56+
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
5757
with:
5858
egress-policy: audit
5959

.github/workflows/codeql.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ jobs:
5959
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
6060
steps:
6161
- name: Harden Runner
62-
uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
62+
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
6363
with:
6464
egress-policy: audit
6565

.github/workflows/dependency-review.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
runs-on: ubuntu-latest
2323
steps:
2424
- name: Harden Runner
25-
uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
25+
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
2626
with:
2727
egress-policy: audit
2828

.github/workflows/scorecard.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131

3232
steps:
3333
- name: Harden Runner
34-
uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
34+
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
3535
with:
3636
egress-policy: audit
3737

@@ -48,7 +48,7 @@ jobs:
4848
publish_results: true
4949

5050
- name: "Upload artifact"
51-
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
51+
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
5252
with:
5353
name: SARIF file
5454
path: results.sarif

.github/workflows/sw360_container.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444
sw360_version: ${{ steps.pom_version.outputs.SW360_VERSION }}
4545
steps:
4646
- name: Harden Runner
47-
uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
47+
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
4848
with:
4949
egress-policy: audit
5050

@@ -74,7 +74,7 @@ jobs:
7474

7575
steps:
7676
- name: Harden Runner
77-
uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
77+
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
7878
with:
7979
egress-policy: audit
8080

.github/workflows/thrift_container.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535

3636
steps:
3737
- name: Harden Runner
38-
uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
38+
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
3939
with:
4040
egress-policy: audit
4141

backend/common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java

Lines changed: 78 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@
3535
import org.eclipse.sw360.datahandler.permissions.PermissionUtils;
3636
import org.eclipse.sw360.datahandler.permissions.ProjectPermissions;
3737
import org.eclipse.sw360.datahandler.thrift.*;
38-
import org.eclipse.sw360.datahandler.thrift.attachments.Attachment;
39-
import org.eclipse.sw360.datahandler.thrift.attachments.AttachmentContent;
38+
import org.eclipse.sw360.datahandler.thrift.attachments.*;
4039
import org.eclipse.sw360.datahandler.thrift.changelogs.ChangeLogs;
4140
import org.eclipse.sw360.datahandler.thrift.changelogs.Operation;
4241
import org.eclipse.sw360.datahandler.thrift.components.*;
@@ -80,8 +79,7 @@
8079
import static org.eclipse.sw360.datahandler.common.SW360Assert.assertId;
8180
import static org.eclipse.sw360.datahandler.common.SW360Assert.assertNotNull;
8281
import static org.eclipse.sw360.datahandler.common.SW360Assert.fail;
83-
import static org.eclipse.sw360.datahandler.common.SW360ConfigKeys.IS_PACKAGE_PORTLET_ENABLED;
84-
import static org.eclipse.sw360.datahandler.common.SW360ConfigKeys.MAINLINE_STATE_ENABLED_FOR_USER;
82+
import static org.eclipse.sw360.datahandler.common.SW360ConfigKeys.*;
8583
import static org.eclipse.sw360.datahandler.common.SW360Utils.getBUFromOrganisation;
8684
import static org.eclipse.sw360.datahandler.common.SW360Utils.getCreatedOn;
8785
import static org.eclipse.sw360.datahandler.common.SW360Utils.printName;
@@ -154,6 +152,7 @@ public class ProjectDatabaseHandler extends AttachmentAwareDatabaseHandler {
154152
Project._Fields.LICENSE_INFO_HEADER_TEXT);
155153
private Map<String, Project> cachedAllProjectsIdMap;
156154
private Instant cachedAllProjectsIdMapLoadingInstant;
155+
private final ThriftClients thriftClients;
157156

158157
public ProjectDatabaseHandler(Cloudant client, String dbName, String attachmentDbName) throws MalformedURLException {
159158
this(client, dbName, attachmentDbName, new ProjectModerator(),
@@ -204,6 +203,8 @@ public ProjectDatabaseHandler(Cloudant client, String dbName, String attachmentD
204203
this.packageDatabaseHandler = packageDatabaseHandler;
205204
DatabaseConnectorCloudant dbChangelogs = new DatabaseConnectorCloudant(client, DatabaseSettings.COUCH_DB_CHANGE_LOGS);
206205
this.dbHandlerUtil = new DatabaseHandlerUtil(dbChangelogs);
206+
207+
thriftClients = new ThriftClients();
207208
}
208209

209210
/////////////////////
@@ -425,6 +426,10 @@ public AddDocumentRequestSummary addProject(Project project, User user) throws S
425426
// Add project to database and return ID
426427
repository.add(project);
427428

429+
if (SW360Utils.readConfig(INHERIT_ATTACHMENT_USAGES, false) && !CommonUtils.isNullOrEmptyMap(project.getLinkedProjects())) {
430+
saveAttachmentUsages(project);
431+
}
432+
428433
dbHandlerUtil.addChangeLogs(project, null, user.getEmail(), Operation.CREATE, null, Lists.newArrayList(),
429434
null, null);
430435
sendMailNotificationsForNewProject(project, user.getEmail());
@@ -480,6 +485,16 @@ public RequestStatus updateProject(Project project, User user, boolean forceUpda
480485
updateProjectDependentLinkedFields(project, actual);
481486
project.unsetVendor();
482487
updateModifiedFields(project, user.getEmail());
488+
489+
if (SW360Utils.readConfig(INHERIT_ATTACHMENT_USAGES, false)) {
490+
Set<String> newLinkedProjects = CommonUtils.isNullOrEmptyMap(project.getLinkedProjects()) ? new HashSet<>() : new HashSet<>(project.getLinkedProjects().keySet());
491+
Set<String> actualLinkedProjects = CommonUtils.isNullOrEmptyMap(actual.getLinkedProjects()) ? new HashSet<>() : actual.getLinkedProjects().keySet();
492+
493+
newLinkedProjects.removeAll(actualLinkedProjects);
494+
if (!newLinkedProjects.isEmpty()) {
495+
saveAttachmentUsages(project);
496+
}
497+
}
483498
repository.update(project);
484499

485500
List<ChangeLogs> referenceDocLogList=new LinkedList<>();
@@ -504,6 +519,62 @@ public RequestStatus updateProject(Project project, User user, boolean forceUpda
504519
}
505520
}
506521

522+
private void saveAttachmentUsages(Project project) {
523+
AttachmentService.Iface attachmentClient = thriftClients.makeAttachmentClient();
524+
String projectId = project.getId();
525+
List<String> projectPaths = new ArrayList<>();
526+
527+
buildProjectPaths(project,null,projectPaths);
528+
projectPaths.remove(project.getId());
529+
try {
530+
if (!projectPaths.isEmpty()) {
531+
List<AttachmentUsage> newAttachmentUsages = parseAttachmentUsages(projectPaths,projectId);
532+
attachmentClient.makeAttachmentUsages(newAttachmentUsages);
533+
}
534+
} catch (TException e) {
535+
log.error("Saving attachment usages for project " + projectId + " failed", e);
536+
}
537+
}
538+
539+
void buildProjectPaths(Project project, String parentPath, List<String> results) {
540+
String currentPath = parentPath == null ? project.getId() : parentPath + ":" + project.getId();
541+
if(CommonUtils.isNullOrEmptyMap(project.getLinkedProjects())) {
542+
results.add(currentPath);
543+
}
544+
else {
545+
for(Map.Entry<String,ProjectProjectRelationship> entry: project.getLinkedProjects().entrySet()) {
546+
buildProjectPaths(repository.get(entry.getKey()), currentPath, results);
547+
}
548+
results.add(currentPath);
549+
}
550+
}
551+
552+
private List<AttachmentUsage> parseAttachmentUsages(List<String> projectPaths, String projectId) {
553+
List<AttachmentUsage> result = new ArrayList<>();
554+
try {
555+
for(String projectPath: projectPaths) {
556+
String[] pathArray = projectPath.split(":");
557+
String subProjectId = pathArray[pathArray.length-1];
558+
List<AttachmentUsage> subProjectAttachmentUsages = thriftClients.makeAttachmentClient().getUsedAttachments(Source.projectId(subProjectId), null);
559+
560+
for(AttachmentUsage usage: subProjectAttachmentUsages) {
561+
String releaseId = usage.getOwner().getReleaseId();
562+
String attachmentContentId = usage.getAttachmentContentId();
563+
AttachmentUsage newUsage = new AttachmentUsage(Source.releaseId(releaseId), attachmentContentId, Source.projectId(projectId));
564+
final UsageData usageData;
565+
LicenseInfoUsage licenseInfoUsage = new LicenseInfoUsage(Collections.emptySet());
566+
licenseInfoUsage.setProjectPath(projectPath);
567+
usageData = UsageData.licenseInfo(licenseInfoUsage);
568+
newUsage.setUsageData(usageData);
569+
result.add(newUsage);
570+
}
571+
}
572+
} catch (TException e) {
573+
log.error("Saving attachment usages for project " + projectId + " failed", e);
574+
}
575+
return result;
576+
}
577+
507578
private void setRequestedDateAndTrimComment(Project project, Project actual, User user) {
508579
Set<String> actualReleaseIds = null;
509580
if (Objects.nonNull(actual) && Objects.nonNull(actual.getReleaseIdToUsage())) {
@@ -862,7 +933,7 @@ private boolean isLinkedReleasesUpdateFromLinkedPackagesFailed(Project updatedPr
862933
final ProjectReleaseRelationship releaseRelation = new ProjectReleaseRelationship(ReleaseRelationship.UNKNOWN, MainlineState.OPEN);
863934
if (CommonUtils.isNotEmpty(linkedPacakgeIds)) {
864935
try {
865-
PackageService.Iface packageClient = new ThriftClients().makePackageClient();
936+
PackageService.Iface packageClient = thriftClients.makePackageClient();
866937
List<Package> addedPackages = packageClient.getPackageByIds(linkedPacakgeIds);
867938

868939
Map<String, ProjectReleaseRelationship> releaseIdToUsageMap = addedPackages.stream().map(Package::getReleaseId)
@@ -894,7 +965,7 @@ private boolean isLinkedReleasesUpdateFromLinkedPackagesFailed(Project updatedPr
894965

895966
if (CommonUtils.isNotEmpty(unlinkedPacakgeIds)) {
896967
try {
897-
PackageService.Iface packageClient = new ThriftClients().makePackageClient();
968+
PackageService.Iface packageClient = thriftClients.makePackageClient();
898969
List<Package> removedPackages = packageClient.getPackageWithReleaseByPackageIds(unlinkedPacakgeIds);
899970

900971
Map<String, Set<String>> releaseIdToPackageIdsMap = removedPackages.stream()
@@ -2064,7 +2135,6 @@ private void propagateSecurityResponsiblesToLinkedProjects(Set<String> responsib
20642135
}
20652136

20662137
private Map<String, String> getGidsByEmail() throws TException {
2067-
ThriftClients thriftClients = new ThriftClients();
20682138
UserService.Iface userClient = thriftClients.makeUserClient();
20692139
Map<String, String> gidByEmail = new HashMap<>();
20702140
userClient
@@ -2386,7 +2456,6 @@ public ByteBuffer getReportDataStream(User user, boolean extendedByReleases, Str
23862456
}
23872457

23882458
private ProjectExporter getProjectExporterObject(List<Project> documents, User user, boolean extendedByReleases) throws SW360Exception {
2389-
ThriftClients thriftClients = new ThriftClients();
23902459
return new ProjectExporter(thriftClients.makeComponentClient(),
23912460
thriftClients.makeProjectClient(), user, documents, extendedByReleases);
23922461
}
@@ -2409,7 +2478,7 @@ public String getReportInEmail(User user,
24092478

24102479
private List<Project> getProjectDetailsBasedOnId(User user, String projectId) throws TException {
24112480
final Collection<ProjectLink> projectLinks = SW360Utils.getLinkedProjectsAsFlatList(projectId, true,
2412-
new ThriftClients(), log, user);
2481+
thriftClients, log, user);
24132482
if (projectLinks.isEmpty()) {
24142483
throw new TException("For the projectId : " + projectId
24152484
+ ", No data available. Please check the projectId and try again.");
@@ -2419,7 +2488,6 @@ private List<Project> getProjectDetailsBasedOnId(User user, String projectId) th
24192488
}
24202489

24212490
public ByteBuffer downloadExcel(User user, boolean extendedByReleases, String token) throws SW360Exception {
2422-
ThriftClients thriftClients = new ThriftClients();
24232491
ProjectExporter exporter = new ProjectExporter(thriftClients.makeComponentClient(),
24242492
thriftClients.makeProjectClient(), user, extendedByReleases);
24252493
try {

backend/common/src/main/java/org/eclipse/sw360/datahandler/db/SW360ConfigsDatabaseHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ private void loadToConfigsInMemForSw360(ConfigContainer configContainer) {
9090
.put(VCS_HOSTS, getOrDefault(configContainer, VCS_HOSTS, "[]"))
9191
.put(NON_PKG_MANAGED_COMPS_PROP, getOrDefault(configContainer, NON_PKG_MANAGED_COMPS_PROP, ""))
9292
.put(REST_API_TOKEN_LENGTH, getOrDefault(configContainer, REST_API_TOKEN_LENGTH, "20"))
93+
.put(INHERIT_ATTACHMENT_USAGES, getOrDefault(configContainer, INHERIT_ATTACHMENT_USAGES, "false"))
9394
.build();
9495
putInMemory(ConfigFor.SW360_CONFIGURATION, configMap);
9596
}
@@ -199,6 +200,7 @@ private boolean isConfigValid(String configKey, String configValue) {
199200
DISABLE_CLEARING_FOSSOLOGY_REPORT_DOWNLOAD,
200201
IS_BULK_RELEASE_DELETING_ENABLED,
201202
IS_PACKAGE_PORTLET_ENABLED,
203+
INHERIT_ATTACHMENT_USAGES,
202204
IS_ADMIN_PRIVATE_ACCESS_ENABLED,
203205
UI_CLEARING_TEAM_UNKNOWN_ENABLED,
204206
UI_CUSTOM_WELCOME_PAGE_GUIDELINE,

backend/moderation/src/main/java/org/eclipse/sw360/moderation/ModerationHandler.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,4 +430,12 @@ public Map<PaginationData, List<ClearingRequest>> searchClearingRequestsByFilter
430430

431431
return handler.searchClearingRequestsByFilters(user, filterMap, pageData);
432432
}
433+
434+
@Override
435+
public RequestStatus deleteClearingRequest(String id, User user) throws TException {
436+
assertId(id);
437+
assertUser(user);
438+
439+
return handler.deleteClearingRequest(id, user);
440+
}
433441
}

backend/moderation/src/main/java/org/eclipse/sw360/moderation/db/ModerationDatabaseHandler.java

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@
6363
import org.apache.thrift.TException;
6464
import org.jetbrains.annotations.NotNull;
6565

66+
import com.ibm.cloud.sdk.core.service.exception.ServiceResponseException;
67+
6668
import java.net.MalformedURLException;
6769
import java.util.*;
6870
import java.util.Map.Entry;
@@ -308,18 +310,84 @@ public RequestStatus updateClearingRequest(ClearingRequest request, User user, S
308310
}
309311

310312
public void updateClearingRequestForProjectDeletion(Project project, User user) {
311-
ClearingRequest clearingRequest = clearingRequestRepository.get(project.getClearingRequestId());
312-
Comment comment = new Comment().setText(new StringBuilder("Clearing Request is orphaned, as project (name): <b>")
313-
.append(SW360Utils.printName(project))
314-
.append("</b> associated with CR is deleted!").toString());
313+
String clearingRequestId = project.getClearingRequestId();
314+
if (CommonUtils.isNullEmptyOrWhitespace(clearingRequestId)) {
315+
log.info("No clearing request id set for project {} deletion.", project.getId());
316+
return;
317+
}
318+
319+
ClearingRequest clearingRequest;
320+
try {
321+
clearingRequest = clearingRequestRepository.get(clearingRequestId);
322+
} catch (ServiceResponseException e) {
323+
log.error(
324+
"Failed to retrieve clearing request for project deletion. Project: {}, CR-ID: {}",
325+
project.getId(),
326+
clearingRequestId,
327+
e);
328+
return;
329+
}
330+
331+
if (clearingRequest == null) {
332+
log.info(
333+
"Clearing request {} not found for project {} deletion. It may have already been deleted.",
334+
clearingRequestId,
335+
project.getId());
336+
return;
337+
}
338+
339+
Comment comment = new Comment().setText("Clearing Request is orphaned, as project (name): <b>"
340+
+ SW360Utils.printName(project)
341+
+ "</b> associated with CR is deleted!");
315342
comment.setCommentedBy(user.getEmail());
316343
comment.setAutoGenerated(true);
317344
comment.setCommentedOn(System.currentTimeMillis());
318345
clearingRequest.unsetProjectId();
319346
clearingRequest.addToComments(comment);
320347
clearingRequest.setModifiedOn(System.currentTimeMillis());
321348
clearingRequest.unsetPriority();
322-
clearingRequestRepository.update(clearingRequest);
349+
try {
350+
clearingRequestRepository.update(clearingRequest);
351+
} catch (ServiceResponseException e) {
352+
log.error(
353+
"Failed to update clearing request for project deletion. Project: {}, CR-ID: {}, User: {}",
354+
project.getId(),
355+
clearingRequestId,
356+
user.getEmail(),
357+
e);
358+
}
359+
}
360+
361+
public RequestStatus deleteClearingRequest(String id, User user) {
362+
ClearingRequest clearingRequest = null;
363+
364+
try {
365+
clearingRequest = clearingRequestRepository.get(id);
366+
} catch (ServiceResponseException e) {
367+
log.debug("Could not find clearing request by ID: " + id + ", trying as project ID");
368+
}
369+
370+
if (clearingRequest == null) {
371+
clearingRequest = clearingRequestRepository.getClearingRequestByProjectId(id);
372+
}
373+
374+
if (clearingRequest != null) {
375+
if (hasPermissionToDeleteClearingRequest(user, clearingRequest)) {
376+
boolean succeeded = clearingRequestRepository.remove(clearingRequest);
377+
return succeeded ? RequestStatus.SUCCESS : RequestStatus.FAILURE;
378+
} else {
379+
log.error("Problems deleting clearing request: User " + user.getEmail() + " tried to delete "
380+
+ "clearing request with ID " + id);
381+
return RequestStatus.FAILURE;
382+
}
383+
}
384+
log.error("Clearing request to delete was null for ID: " + id);
385+
return RequestStatus.FAILURE;
386+
}
387+
388+
private boolean hasPermissionToDeleteClearingRequest(User user, ClearingRequest clearingRequest) {
389+
boolean isCreator = clearingRequest.getRequestingUser().equals(user.getEmail());
390+
return isCreator || PermissionUtils.isUserAtLeast(UserGroup.CLEARING_ADMIN, user);
323391
}
324392

325393
public void updateClearingRequestForChangeInProjectBU(String crId, String businessUnit, User user) {

0 commit comments

Comments
 (0)