Browse Source

updated default mobile app settings, fixed permission

pull/10591/head
dashevchenko 2 years ago
parent
commit
b216898924
  1. 2
      application/src/main/java/org/thingsboard/server/controller/MobileApplicationController.java
  2. 2
      application/src/main/java/org/thingsboard/server/service/qr/MobileSecretCaffeineCache.java
  3. 2
      application/src/main/java/org/thingsboard/server/service/qr/MobileSecretRedisCache.java
  4. 1
      application/src/main/java/org/thingsboard/server/service/security/permission/CustomerUserPermissions.java
  5. 2
      application/src/main/java/org/thingsboard/server/service/security/permission/TenantAdminPermissions.java
  6. 28
      application/src/test/java/org/thingsboard/server/controller/MobileApplicationControllerTest.java
  7. 4
      common/data/src/main/java/org/thingsboard/server/common/data/mobile/QRCodeConfig.java
  8. 29
      dao/src/main/java/org/thingsboard/server/dao/mobile/BaseMobileAppSettingsService.java

2
application/src/main/java/org/thingsboard/server/controller/MobileApplicationController.java

@ -135,7 +135,7 @@ public class MobileApplicationController extends BaseController {
SecurityUser currentUser = getCurrentUser(); SecurityUser currentUser = getCurrentUser();
accessControlService.checkPermission(currentUser, Resource.MOBILE_APP_SETTINGS, Operation.READ); accessControlService.checkPermission(currentUser, Resource.MOBILE_APP_SETTINGS, Operation.READ);
return mobileAppSettingsService.getMobileAppSettings(currentUser.getTenantId()); return mobileAppSettingsService.getMobileAppSettings(TenantId.SYS_TENANT_ID);
} }
@ApiOperation(value = "Get the deep link to the associated mobile application (getMobileAppDeepLink)", @ApiOperation(value = "Get the deep link to the associated mobile application (getMobileAppDeepLink)",

2
application/src/main/java/org/thingsboard/server/service/qr/MobileSecretCaffeineCache.java

@ -23,7 +23,7 @@ import org.thingsboard.server.common.data.CacheConstants;
import org.thingsboard.server.common.data.security.model.JwtPair; import org.thingsboard.server.common.data.security.model.JwtPair;
@ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "caffeine", matchIfMissing = true) @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "caffeine", matchIfMissing = true)
@Service("QRSecretCache") @Service("MobileSecretCache")
public class MobileSecretCaffeineCache extends CaffeineTbTransactionalCache<String, JwtPair> { public class MobileSecretCaffeineCache extends CaffeineTbTransactionalCache<String, JwtPair> {
public MobileSecretCaffeineCache(CacheManager cacheManager) { public MobileSecretCaffeineCache(CacheManager cacheManager) {

2
application/src/main/java/org/thingsboard/server/service/qr/MobileSecretRedisCache.java

@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.security.model.JwtPair; import org.thingsboard.server.common.data.security.model.JwtPair;
@ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "redis") @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "redis")
@Service("QRSecretCache") @Service("MobileSecretCache")
public class MobileSecretRedisCache extends RedisTbTransactionalCache<UserId, JwtPair> { public class MobileSecretRedisCache extends RedisTbTransactionalCache<UserId, JwtPair> {
public MobileSecretRedisCache(TBRedisCacheConfiguration configuration, CacheSpecsMap cacheSpecsMap, RedisConnectionFactory connectionFactory) { public MobileSecretRedisCache(TBRedisCacheConfiguration configuration, CacheSpecsMap cacheSpecsMap, RedisConnectionFactory connectionFactory) {

1
application/src/main/java/org/thingsboard/server/service/security/permission/CustomerUserPermissions.java

@ -49,6 +49,7 @@ public class CustomerUserPermissions extends AbstractPermissions {
put(Resource.DEVICE_PROFILE, profilePermissionChecker); put(Resource.DEVICE_PROFILE, profilePermissionChecker);
put(Resource.ASSET_PROFILE, profilePermissionChecker); put(Resource.ASSET_PROFILE, profilePermissionChecker);
put(Resource.TB_RESOURCE, customerResourcePermissionChecker); put(Resource.TB_RESOURCE, customerResourcePermissionChecker);
put(Resource.MOBILE_APP_SETTINGS, new PermissionChecker.GenericPermissionChecker(Operation.READ));
} }
private static final PermissionChecker customerAlarmPermissionChecker = new PermissionChecker() { private static final PermissionChecker customerAlarmPermissionChecker = new PermissionChecker() {

2
application/src/main/java/org/thingsboard/server/service/security/permission/TenantAdminPermissions.java

@ -50,7 +50,7 @@ public class TenantAdminPermissions extends AbstractPermissions {
put(Resource.QUEUE, queuePermissionChecker); put(Resource.QUEUE, queuePermissionChecker);
put(Resource.VERSION_CONTROL, PermissionChecker.allowAllPermissionChecker); put(Resource.VERSION_CONTROL, PermissionChecker.allowAllPermissionChecker);
put(Resource.NOTIFICATION, tenantEntityPermissionChecker); put(Resource.NOTIFICATION, tenantEntityPermissionChecker);
put(Resource.MOBILE_APP_SETTINGS, PermissionChecker.allowAllPermissionChecker); put(Resource.MOBILE_APP_SETTINGS, new PermissionChecker.GenericPermissionChecker(Operation.READ));
} }
public static final PermissionChecker tenantEntityPermissionChecker = new PermissionChecker() { public static final PermissionChecker tenantEntityPermissionChecker = new PermissionChecker() {

28
application/src/test/java/org/thingsboard/server/controller/MobileApplicationControllerTest.java

@ -104,8 +104,10 @@ public class MobileApplicationControllerTest extends AbstractControllerTest {
Pattern expectedPattern = Pattern.compile("https://([^/]+)/api/noauth/qr\\?secret=([^&]+)&ttl=([^&]+)&host=([^&]+)"); Pattern expectedPattern = Pattern.compile("https://([^/]+)/api/noauth/qr\\?secret=([^&]+)&ttl=([^&]+)&host=([^&]+)");
Matcher parsedDeepLink = expectedPattern.matcher(deepLink); Matcher parsedDeepLink = expectedPattern.matcher(deepLink);
assertThat(parsedDeepLink.matches()).isTrue(); assertThat(parsedDeepLink.matches()).isTrue();
String appHost = parsedDeepLink.group(1);
String secret = parsedDeepLink.group(2); String secret = parsedDeepLink.group(2);
String ttl = parsedDeepLink.group(3); String ttl = parsedDeepLink.group(3);
assertThat(appHost).isEqualTo("demo.thingsboard.io");
assertThat(ttl).isEqualTo(String.valueOf(mobileSecretKeyTtl)); assertThat(ttl).isEqualTo(String.valueOf(mobileSecretKeyTtl));
JwtPair jwtPair = doGet("/api/noauth/qr/" + secret, JwtPair.class); JwtPair jwtPair = doGet("/api/noauth/qr/" + secret, JwtPair.class);
@ -128,5 +130,31 @@ public class MobileApplicationControllerTest extends AbstractControllerTest {
JwtPair customerJwtPair = doGet("/api/noauth/qr/" + customerSecret, JwtPair.class); JwtPair customerJwtPair = doGet("/api/noauth/qr/" + customerSecret, JwtPair.class);
assertThat(customerJwtPair).isNotNull(); assertThat(customerJwtPair).isNotNull();
// update mobile setting to use custom one
loginSysAdmin();
MobileAppSettings mobileAppSettings = doGet("/api/mobile/app/settings", MobileAppSettings.class);
mobileAppSettings.setUseDefault(false);
doPost("/api/mobile/app/settings", mobileAppSettings);
String customAppDeepLink = doGet("/api/mobile/deepLink", String.class);
Pattern customAppExpectedPattern = Pattern.compile("https://([^/]+)/api/noauth/qr\\?secret=([^&]+)&ttl=([^&]+)");
Matcher customAppParsedDeepLink = customAppExpectedPattern.matcher(customAppDeepLink);
assertThat(customAppParsedDeepLink.matches()).isTrue();
assertThat(customAppParsedDeepLink.group(1)).isEqualTo("localhost");
loginTenantAdmin();
String tenantCustomAppDeepLink = doGet("/api/mobile/deepLink", String.class);
Matcher tenantCustomAppParsedDeepLink = customAppExpectedPattern.matcher(tenantCustomAppDeepLink);
assertThat(tenantCustomAppParsedDeepLink.matches()).isTrue();
assertThat(tenantCustomAppParsedDeepLink.group(1)).isEqualTo("localhost");
loginCustomerUser();
String customerCustomAppDeepLink = doGet("/api/mobile/deepLink", String.class);
Matcher customerCustomAppParsedDeepLink = customAppExpectedPattern.matcher(customerCustomAppDeepLink);
assertThat(customerCustomAppParsedDeepLink.matches()).isTrue();
assertThat(customerCustomAppParsedDeepLink.group(1)).isEqualTo("localhost");
} }
} }

4
common/data/src/main/java/org/thingsboard/server/common/data/mobile/QRCodeConfig.java

@ -16,12 +16,14 @@
package org.thingsboard.server.common.data.mobile; package org.thingsboard.server.common.data.mobile;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.validation.NoXss; import org.thingsboard.server.common.data.validation.NoXss;
@Data @Data
@Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode @EqualsAndHashCode
@ -29,7 +31,7 @@ public class QRCodeConfig {
private boolean showOnHomePage; private boolean showOnHomePage;
private boolean badgeEnabled; private boolean badgeEnabled;
private boolean labelEnabled; private boolean qrCodeLabelEnabled;
private BadgePosition badgePosition; private BadgePosition badgePosition;
private BadgeStyle badgeStyle; private BadgeStyle badgeStyle;
@NoXss @NoXss

29
dao/src/main/java/org/thingsboard/server/dao/mobile/BaseMobileAppSettingsService.java

@ -20,8 +20,10 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.event.TransactionalEventListener; import org.springframework.transaction.event.TransactionalEventListener;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.mobile.AndroidConfig;
import org.thingsboard.server.common.data.mobile.BadgePosition; import org.thingsboard.server.common.data.mobile.BadgePosition;
import org.thingsboard.server.common.data.mobile.BadgeStyle; import org.thingsboard.server.common.data.mobile.BadgeStyle;
import org.thingsboard.server.common.data.mobile.IosConfig;
import org.thingsboard.server.common.data.mobile.MobileAppSettings; import org.thingsboard.server.common.data.mobile.MobileAppSettings;
import org.thingsboard.server.common.data.mobile.QRCodeConfig; import org.thingsboard.server.common.data.mobile.QRCodeConfig;
import org.thingsboard.server.dao.entity.AbstractCachedService; import org.thingsboard.server.dao.entity.AbstractCachedService;
@ -45,7 +47,7 @@ public class BaseMobileAppSettingsService extends AbstractCachedService<TenantId
public MobileAppSettings getMobileAppSettings(TenantId tenantId) { public MobileAppSettings getMobileAppSettings(TenantId tenantId) {
log.trace("Executing getMobileAppSettings for tenant [{}] ", tenantId); log.trace("Executing getMobileAppSettings for tenant [{}] ", tenantId);
MobileAppSettings mobileAppSettings = cache.getAndPutInTransaction(tenantId, MobileAppSettings mobileAppSettings = cache.getAndPutInTransaction(tenantId,
() -> mobileAppSettingsDao.findByTenantId(tenantId), false); () -> mobileAppSettingsDao.findByTenantId(tenantId), true);
return constructMobileAppSettings(mobileAppSettings); return constructMobileAppSettings(mobileAppSettings);
} }
@ -60,14 +62,25 @@ public class BaseMobileAppSettingsService extends AbstractCachedService<TenantId
mobileAppSettings = new MobileAppSettings(); mobileAppSettings = new MobileAppSettings();
mobileAppSettings.setUseDefault(true); mobileAppSettings.setUseDefault(true);
QRCodeConfig qrCodeConfig = new QRCodeConfig(); AndroidConfig androidConfig = AndroidConfig.builder()
qrCodeConfig.setQrCodeLabel(DEFAULT_QR_CODE_LABEL); .enabled(true)
qrCodeConfig.setShowOnHomePage(true); .build();
qrCodeConfig.setBadgeEnabled(true); IosConfig iosConfig = IosConfig.builder()
qrCodeConfig.setLabelEnabled(true); .enabled(true)
qrCodeConfig.setBadgePosition(BadgePosition.RIGHT); .build();
qrCodeConfig.setBadgeStyle(BadgeStyle.ORIGINAL); QRCodeConfig qrCodeConfig = QRCodeConfig.builder()
.showOnHomePage(true)
.qrCodeLabelEnabled(true)
.qrCodeLabel(DEFAULT_QR_CODE_LABEL)
.badgeEnabled(true)
.badgePosition(BadgePosition.RIGHT)
.badgeStyle(BadgeStyle.ORIGINAL)
.badgeEnabled(true)
.build();
mobileAppSettings.setQrCodeConfig(qrCodeConfig); mobileAppSettings.setQrCodeConfig(qrCodeConfig);
mobileAppSettings.setAndroidConfig(androidConfig);
mobileAppSettings.setIosConfig(iosConfig);
} }
return mobileAppSettings; return mobileAppSettings;
} }

Loading…
Cancel
Save