Skip to content

Dev -> Main - v2.3.1 Fix #737

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 49 commits into from
Mar 4, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
bc9d45c
Merge branch 'dev' of https://github.com/lowcoder-org/lowcoder into dev
freddysundowner Feb 19, 2024
c60dcce
Merge branch 'dev' of https://github.com/lowcoder-org/lowcoder into dev
freddysundowner Feb 21, 2024
ebfbdfd
added licence key data field
freddysundowner Feb 22, 2024
e7014bb
Merge branch 'dev' of https://github.com/lowcoder-org/lowcoder into c…
freddysundowner Feb 23, 2024
df156a5
fixed access of licence in the full calendar
freddysundowner Feb 23, 2024
0e95abd
fixed bug on licence key input filled
freddysundowner Feb 23, 2024
a1918e5
"add premium and free calendar options drop down"
freddysundowner Feb 26, 2024
4b86584
removed hand coded licence key
freddysundowner Feb 26, 2024
50f87fc
Mention component height issue fix, checkbox component hover backgrou…
imtananikhwa Feb 26, 2024
658e299
Add logs for debugging
aq-ikhwa-tech Feb 27, 2024
4890116
fix for comps hide on adding to modal/drawer
raheeliftikhar5 Feb 27, 2024
6b8a497
Fixes and introduction of text-decoration and text transform property…
imtananikhwa Feb 27, 2024
f501802
CSS styles and propeties added to tabbed container while ensuring the…
imtananikhwa Feb 27, 2024
2c80045
CSS properties and their control added for segment control
imtananikhwa Feb 27, 2024
8e9ab45
Toasts Notification & Loading Mesages
sudoischenny Feb 27, 2024
36ccf9a
Merge branch 'lowcoder-org:main' into main
sudoischenny Feb 27, 2024
683179c
Update Toasts Image
sudoischenny Feb 27, 2024
3708c30
Added toast.destroy()
sudoischenny Feb 27, 2024
791cff1
Toast Dismiss
sudoischenny Feb 27, 2024
9857111
Add migration to fix existing application public view bug
aq-ikhwa-tech Feb 28, 2024
e5bbd35
Remove unnecessary logs
aq-ikhwa-tech Feb 28, 2024
a85f478
fixed styledcomponent warning in drawerComp
raheeliftikhar5 Feb 28, 2024
08b675a
added app meta fields
raheeliftikhar5 Feb 28, 2024
27d870d
Merge pull request #1 from lowcoder-org/dev
sudoischenny Feb 28, 2024
220c0cc
Merge branch 'lowcoder-org:main' into main
sudoischenny Feb 28, 2024
f30fdf2
TS issue fixed
imtananikhwa Feb 28, 2024
6e81667
Tab container type removal, due to compiler error
imtananikhwa Feb 28, 2024
a6be0ab
Merge pull request #718 from lowcoder-org/add-logs-to-debug-api-stats…
FalkWolsky Feb 28, 2024
2f7487b
Merge branch 'dev' into imtanan-task1
FalkWolsky Feb 28, 2024
b395356
Merge pull request #719 from imtananikhwa/imtanan-task1
FalkWolsky Feb 28, 2024
56d2086
Merge branch 'dev' into main
FalkWolsky Feb 28, 2024
eb3854b
Merge pull request #721 from sudoischenny/main
FalkWolsky Feb 28, 2024
8d6bf63
Merge branch 'dev' into fix_modal_comps_invisible
FalkWolsky Feb 28, 2024
5e5f73c
Merge pull request #724 from raheeliftikhar5/fix_modal_comps_invisible
FalkWolsky Feb 28, 2024
fa20094
Merge branch 'dev' into app_meta_field
FalkWolsky Feb 28, 2024
e379627
Merge pull request #725 from raheeliftikhar5/app_meta_field
FalkWolsky Feb 28, 2024
b6e1e2c
Added Comments to Marketplace Use
Feb 29, 2024
877f9f5
Add Support as App Category
Feb 29, 2024
4f58b96
Adding Admin Area Icons
Mar 1, 2024
1c44f3a
Changing Readme for latest ENV Variables
Mar 1, 2024
c96bb7e
Rounding Up Marketplace and Multi-Icon Component
Mar 3, 2024
cc5333c
Added comments based on common discussion
Feb 29, 2024
120fbc9
fix: sorted out application view rights for all cases
ludomikula Feb 29, 2024
de03572
fix: update location of marketplace app settings
ludomikula Mar 1, 2024
d5c9c32
fix: for now, allow to view non-published apps for logged in users
ludomikula Mar 1, 2024
35472c0
Adding mn height for App Cards in Marketplace
Mar 4, 2024
73ea344
Merge branch 'dev' into calendar-licenc-key
FalkWolsky Mar 4, 2024
3452d4b
Merge pull request #736 from lowcoder-org/calendar-licenc-key
FalkWolsky Mar 4, 2024
f31c4f9
Increase Lowcoder Comps Version
Mar 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: sorted out application view rights for all cases
  • Loading branch information
ludomikula committed Mar 4, 2024
commit 120fbc929a6a09e2e88f076c45745929ce4d7ac4
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.lowcoder.domain.application.model;

public enum ApplicationRequestType {
PUBLIC_TO_ALL,
PUBLIC_TO_MARKETPLACE,
AGENCY_PROFILE,
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,28 @@ public interface ApplicationRepository extends ReactiveMongoRepository<Applicati
// this we do not need
// Flux<Application> findByPublicToAllIsTrueAndPublicToMarketplaceIsAndAgencyProfileIsAndIdIn(Boolean publicToMarketplace, Boolean agencyProfile, Collection<String> ids);

// Find all Public Applications
Flux<Application> findByPublicToAllIsTrue();

// Find all Marketplace Apps
/**
* Filter public applications from list of supplied IDs
*/
Flux<Application> findByPublicToAllIsTrueAndIdIn(Collection<String> ids);

/**
* Filter marketplace applications from list of supplied IDs
*/
Flux<Application> findByPublicToAllIsTrueAndPublicToMarketplaceIsTrueAndIdIn(Collection<String> ids);

/**
* Filter agency applications from list of supplied IDs
*/
Flux<Application> findByPublicToAllIsTrueAndAgencyProfileIsTrueAndIdIn(Collection<String> ids);

/**
* Find all marketplace applications
*/
Flux<Application> findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue();

// Find all Agencies

/**
* Find all agency applications
*/
Flux<Application> findByPublicToAllIsTrueAndAgencyProfileIsTrue();

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.stream.Collectors;

import org.lowcoder.domain.application.model.Application;
import org.lowcoder.domain.application.model.ApplicationRequestType;
import org.lowcoder.domain.application.model.ApplicationStatus;
import org.lowcoder.domain.application.repository.ApplicationRepository;
import org.lowcoder.domain.permission.model.ResourceRole;
Expand Down Expand Up @@ -157,8 +158,6 @@ public Mono<Boolean> setApplicationPublicToMarketplace(String applicationId, Boo

return findById(applicationId)

// Falk: question - do we need Map<String, Object> applicationDsl = application.getEditingApplicationDSL(); and .editingApplicationDSL(applicationDsl) - or is .publicToMarketplace(publicToMarketplace).build(); enough?

.map(application -> {

Map<String, Object> applicationDsl = application.getEditingApplicationDSL();
Expand Down Expand Up @@ -204,81 +203,64 @@ public Mono<Boolean> setApplicationAsAgencyProfile(String applicationId, boolean
return mongoUpsertHelper.updateById(application, applicationId);
}

// getPublicApplicationIds /view - publicToAll check
// getPublicMarketplaceApplicationIds / marketplace_view - publicToAll and publicToMarketplace check & isPrivateMarketplace check
// getPublicAgencyProfileApplicationIds / agency_profile_view - publicToAll and agencyProfile check

// marketplace_view [anonymous] publicToAll and publicToMarketplace check & isPrivateMarketplace false -> OK
@NonEmptyMono
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
public Mono<Set<String>> getFilteredPublicApplicationIds(ApplicationRequestType requestType, Collection<String> applicationIds, Boolean isAnonymous, Boolean isPrivateMarketplace) {

switch(requestType)
{
case PUBLIC_TO_ALL:
return getPublicApplicationIds(applicationIds);
case PUBLIC_TO_MARKETPLACE:
return getPublicMarketplaceApplicationIds(applicationIds, isAnonymous, isPrivateMarketplace);
case AGENCY_PROFILE:
return getPublicAgencyApplicationIds(applicationIds);
default:
return Mono.empty();
}
}

// marketplace_view [anonymous] publicToAll and publicToMarketplace check & isPrivateMarketplace true -> NOT OK

// marketplace_view [LoggedIn] publicToAll and publicToMarketplace check & isPrivateMarketplace true -> OK
// marketplace_view [LoggedIn] publicToAll and publicToMarketplace check & isPrivateMarketplace false -> OK


// will be extended by EndpointType
/*
* if (EndpointType == view)
* if (EndpointType == marketplace_view)
* if (EndpointType == agency_profile_view)

/**
* Find all public applications - doesn't matter if user is anonymous, because these apps are public
*/

// is it needed?
@NonEmptyMono
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
public Mono<Set<String>> getPublicApplicationIds(Collection<String> applicationIds, Boolean isAnonymous, Boolean isPrivateMarketplace) {
public Mono<Set<String>> getPublicApplicationIds(Collection<String> applicationIds) {

return repository.findByPublicToAllIsTrue()
return repository.findByPublicToAllIsTrueAndIdIn(applicationIds)
.map(HasIdAndAuditing::getId)
.collect(Collectors.toSet());
}

// for Marketplaces

/**
* Find all marketplace applications - filter based on whether user is anonymous and whether it's a private marketplace
*/
@NonEmptyMono
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
public Mono<Set<String>> getPublicMarketplaceApplicationIds(Collection<String> applicationIds, Boolean isAnonymous, Boolean isPrivateMarketplace) {

if(isAnonymous) {
if(isPrivateMarketplace) {
return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue(false, false, applicationIds)
.map(HasIdAndAuditing::getId)
.collect(Collectors.toSet());
} else {
return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue(true, false, applicationIds)
.map(HasIdAndAuditing::getId)
.collect(Collectors.toSet());
}
} else {
return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue(true, true, applicationIds)
.map(HasIdAndAuditing::getId)
.collect(Collectors.toSet());
}


public Mono<Set<String>> getPublicMarketplaceApplicationIds(Collection<String> applicationIds, boolean isAnonymous, boolean isPrivateMarketplace) {

if ((isAnonymous && !isPrivateMarketplace) || !isAnonymous)
{
return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrueAndIdIn(applicationIds)
.map(HasIdAndAuditing::getId)
.collect(Collectors.toSet());
}
return Mono.empty();
}

// for Agencies
/**
* Find all agency applications
*/
@NonEmptyMono
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
public Mono<Set<String>> getPublicAgencyApplicationIds(Collection<String> applicationIds, Boolean isAnonymous, Boolean isPrivateMarketplace) {

if(isAnonymous) {
if(isPrivateMarketplace) {
return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsAndAgencyProfileIsAndIdIn(false, false, applicationIds)
.map(HasIdAndAuditing::getId)
.collect(Collectors.toSet());
} else {
return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsAndAgencyProfileIsAndIdIn(true, false, applicationIds)
.map(HasIdAndAuditing::getId)
.collect(Collectors.toSet());
}
} else {
return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsOrAgencyProfileIsAndIdIn(true, true, applicationIds)
.map(HasIdAndAuditing::getId)
.collect(Collectors.toSet());
}

public Mono<Set<String>> getPublicAgencyApplicationIds(Collection<String> applicationIds) {

return repository.findByPublicToAllIsTrueAndAgencyProfileIsTrueAndIdIn(applicationIds)
.map(HasIdAndAuditing::getId)
.collect(Collectors.toSet());
}

public Flux<Application> findAll() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.util.Set;

import org.lowcoder.domain.application.model.Application;
import org.lowcoder.domain.application.model.ApplicationRequestType;
import org.lowcoder.domain.application.service.ApplicationService;
import org.lowcoder.domain.permission.model.ResourceAction;
import org.lowcoder.domain.permission.model.ResourcePermission;
Expand Down Expand Up @@ -46,7 +47,7 @@ protected Mono<Map<String, List<ResourcePermission>>> getAnonymousUserPermission
}

Set<String> applicationIds = newHashSet(resourceIds);
return Mono.zip(applicationService.getPublicApplicationIds(applicationIds, Boolean.TRUE, config.getMarketplace().isPrivateMode()),
return Mono.zip(applicationService.getPublicApplicationIds(applicationIds),
templateSolution.getTemplateApplicationIds(applicationIds))
.map(tuple -> {
Set<String> publicAppIds = tuple.getT1();
Expand All @@ -61,7 +62,7 @@ protected Mono<Map<String, List<ResourcePermission>>> getAnonymousUserPermission
(Collection<String> resourceIds, ResourceAction resourceAction) {

Set<String> applicationIds = newHashSet(resourceIds);
return Mono.zip(applicationService.getPublicApplicationIds(applicationIds, Boolean.FALSE, config.getMarketplace().isPrivateMode()),
return Mono.zip(applicationService.getPublicApplicationIds(applicationIds),
templateSolution.getTemplateApplicationIds(applicationIds))
.map(tuple -> {
Set<String> publicAppIds = tuple.getT1();
Expand All @@ -70,7 +71,39 @@ protected Mono<Map<String, List<ResourcePermission>>> getAnonymousUserPermission
});
}

private List<ResourcePermission> getAnonymousUserPermission(String applicationId) {

@Override
protected Mono<Map<String, List<ResourcePermission>>> getAnonymousUserApplicationPermissions(
Collection<String> resourceIds, ResourceAction resourceAction, ApplicationRequestType requestType)
{
if (!ANONYMOUS_USER_ROLE.canDo(resourceAction)) {
return Mono.just(emptyMap());
}

Set<String> applicationIds = newHashSet(resourceIds);
return Mono.zip(applicationService.getFilteredPublicApplicationIds(requestType, applicationIds, Boolean.TRUE, config.getMarketplace().isPrivateMode()),
templateSolution.getTemplateApplicationIds(applicationIds))
.map(tuple -> {
Set<String> publicAppIds = tuple.getT1();
Set<String> templateAppIds = tuple.getT2();
return collectMap(union(publicAppIds, templateAppIds), identity(), this::getAnonymousUserPermission);
});
}

@Override
protected Mono<Map<String, List<ResourcePermission>>> getNonAnonymousUserApplicationPublicResourcePermissions(
Collection<String> resourceIds, ResourceAction resourceAction, ApplicationRequestType requestType) {
Set<String> applicationIds = newHashSet(resourceIds);
return Mono.zip(applicationService.getFilteredPublicApplicationIds(requestType, applicationIds, Boolean.FALSE, config.getMarketplace().isPrivateMode()),
templateSolution.getTemplateApplicationIds(applicationIds))
.map(tuple -> {
Set<String> publicAppIds = tuple.getT1();
Set<String> templateAppIds = tuple.getT2();
return collectMap(union(publicAppIds, templateAppIds), identity(), this::getAnonymousUserPermission);
});
}

private List<ResourcePermission> getAnonymousUserPermission(String applicationId) {
return Collections.singletonList(ResourcePermission.builder()
.resourceId(applicationId)
.resourceType(ResourceType.APPLICATION)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.util.stream.Collectors;

import org.apache.commons.collections4.CollectionUtils;
import org.lowcoder.domain.application.model.ApplicationRequestType;
import org.lowcoder.domain.datasource.model.Datasource;
import org.lowcoder.domain.datasource.service.DatasourceService;
import org.lowcoder.domain.permission.model.ResourceAction;
Expand Down Expand Up @@ -44,6 +45,18 @@ protected Mono<Map<String, List<ResourcePermission>>> getNonAnonymousUserPublicR
}

@Override
protected Mono<Map<String, List<ResourcePermission>>> getAnonymousUserApplicationPermissions(
Collection<String> resourceIds, ResourceAction resourceAction, ApplicationRequestType requestType) {
return Mono.just(Collections.emptyMap());
}

@Override
protected Mono<Map<String, List<ResourcePermission>>> getNonAnonymousUserApplicationPublicResourcePermissions(
Collection<String> resourceIds, ResourceAction resourceAction, ApplicationRequestType requestType) {
return Mono.just(Collections.emptyMap());
}

@Override
protected Mono<String> getOrgId(String resourceId) {
return datasourceService.getById(resourceId)
.map(Datasource::getOrganizationId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.lowcoder.domain.application.model.ApplicationRequestType;
import org.lowcoder.domain.group.service.GroupMemberService;
import org.lowcoder.domain.organization.service.OrgMemberService;
import org.lowcoder.domain.permission.model.ResourceAction;
Expand Down Expand Up @@ -153,6 +154,13 @@ protected abstract Mono<Map<String, List<ResourcePermission>>> getAnonymousUserP
protected abstract Mono<Map<String, List<ResourcePermission>>> getNonAnonymousUserPublicResourcePermissions
(Collection<String> resourceIds, ResourceAction resourceAction);

protected abstract Mono<Map<String, List<ResourcePermission>>> getAnonymousUserApplicationPermissions(Collection<String> resourceIds,
ResourceAction resourceAction, ApplicationRequestType requestType);

protected abstract Mono<Map<String, List<ResourcePermission>>> getNonAnonymousUserApplicationPublicResourcePermissions
(Collection<String> resourceIds, ResourceAction resourceAction, ApplicationRequestType requestType);


private Mono<Map<String, List<ResourcePermission>>> getAllMatchingPermissions0(String userId, String orgId, ResourceType resourceType,
Collection<String> resourceIds,
ResourceAction resourceAction) {
Expand Down Expand Up @@ -212,4 +220,63 @@ private Mono<Set<String>> getUserGroupIds(String orgId, String userId) {
}

protected abstract Mono<String> getOrgId(String resourceId);

public Mono<UserPermissionOnResourceStatus> checkUserPermissionStatusOnApplication(String userId, String resourceId,
ResourceAction resourceAction, ApplicationRequestType requestType)
{
ResourceType resourceType = resourceAction.getResourceType();

Mono<UserPermissionOnResourceStatus> publicResourcePermissionMono = getAnonymousUserApplicationPermissions(singletonList(resourceId), resourceAction, requestType)
.map(it -> it.getOrDefault(resourceId, emptyList()))
.map(it -> {
if (!it.isEmpty()) {
return UserPermissionOnResourceStatus.success(it.get(0));
}
return isAnonymousUser(userId) ? UserPermissionOnResourceStatus.anonymousUser() : UserPermissionOnResourceStatus.notInOrg();
});

if (isAnonymousUser(userId)) {
return publicResourcePermissionMono;
}

Mono<UserPermissionOnResourceStatus> nonAnonymousPublicResourcePermissionMono = getNonAnonymousUserApplicationPublicResourcePermissions(singletonList(resourceId), resourceAction, requestType)
.map(it -> it.getOrDefault(resourceId, emptyList()))
.map(it -> {
if (!it.isEmpty()) {
return UserPermissionOnResourceStatus.success(it.get(0));
}
return isAnonymousUser(userId) ? UserPermissionOnResourceStatus.anonymousUser() : UserPermissionOnResourceStatus.notInOrg();
});


Mono<UserPermissionOnResourceStatus> orgUserPermissionMono = getOrgId(resourceId)
.flatMap(orgId -> orgMemberService.getOrgMember(orgId, userId))
.flatMap(orgMember -> {
if (orgMember.isAdmin()) {
return Mono.just(UserPermissionOnResourceStatus.success(buildAdminPermission(resourceType, resourceId, userId)));
}
return getAllMatchingPermissions0(userId, orgMember.getOrgId(), resourceType, Collections.singleton(resourceId), resourceAction)
.map(it -> it.getOrDefault(resourceId, emptyList()))
.map(permissions -> permissions.isEmpty() ? UserPermissionOnResourceStatus.notEnoughPermission()
: UserPermissionOnResourceStatus.success(getMaxPermission(permissions)));
})
.defaultIfEmpty(UserPermissionOnResourceStatus.notInOrg());

return Mono.zip(publicResourcePermissionMono, nonAnonymousPublicResourcePermissionMono, orgUserPermissionMono)
.map(tuple -> {
UserPermissionOnResourceStatus publicResourcePermission = tuple.getT1();
UserPermissionOnResourceStatus nonAnonymousPublicResourcePermission = tuple.getT2();
UserPermissionOnResourceStatus orgUserPermission = tuple.getT3();
if (orgUserPermission.hasPermission()) {
return orgUserPermission;
}
if(nonAnonymousPublicResourcePermission.hasPermission()) {
return nonAnonymousPublicResourcePermission;
}
if (publicResourcePermission.hasPermission()) {
return publicResourcePermission;
}
return orgUserPermission;
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import javax.validation.constraints.NotNull;

import org.apache.commons.collections4.CollectionUtils;
import org.lowcoder.domain.application.model.ApplicationRequestType;
import org.lowcoder.domain.permission.model.ResourceAction;
import org.lowcoder.domain.permission.model.ResourceHolder;
import org.lowcoder.domain.permission.model.ResourcePermission;
Expand Down Expand Up @@ -221,6 +222,14 @@ public Mono<ResourcePermission> checkAndReturnMaxPermission(String userId, Strin
return resourcePermissionHandler.checkUserPermissionStatusOnResource(userId, resourceId, resourceAction);
}

public Mono<UserPermissionOnResourceStatus> checkUserPermissionStatusOnApplication
(String userId, String resourceId, ResourceAction resourceAction, ApplicationRequestType requestType) {
ResourceType resourceType = resourceAction.getResourceType();
var resourcePermissionHandler = getResourcePermissionHandler(resourceType);
return resourcePermissionHandler.checkUserPermissionStatusOnApplication(userId, resourceId, resourceAction, requestType);
}


public Mono<Boolean> removeUserApplicationPermission(String appId, String userId) {
return repository.removePermissionBy(ResourceType.APPLICATION, appId, ResourceHolder.USER, userId);
}
Expand Down
Loading