Browse Source

fix(iot-hub): use DeviceConnectivityService for transport variables

The admin settings endpoint requires SYS_ADMIN authority but the device
install wizard runs as TENANT_ADMIN.

Fix: add getConnectivityInfo(baseUrl) to DeviceConnectivityService which
resolves host/port with baseUrl fallback (reusing existing getHost/getPort
logic). Expose via new TENANT_ADMIN endpoint GET /api/iot-hub/connectivity.
Remove AdminService dependency from the dialog component.
pull/15508/head
Andrii Shvaika 6 months ago
parent
commit
3364b36000
  1. 12
      application/src/main/java/org/thingsboard/server/controller/IotHubController.java
  2. 2
      common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityService.java
  3. 18
      dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityServiceImpl.java
  4. 8
      ui-ngx/src/app/core/http/iot-hub-api.service.ts
  5. 8
      ui-ngx/src/app/modules/home/components/iot-hub/device-install-dialog/device-install-dialog.component.ts

12
application/src/main/java/org/thingsboard/server/controller/IotHubController.java

@ -40,8 +40,10 @@ import org.thingsboard.server.common.data.page.PageLink;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.thingsboard.server.common.data.id.IotHubInstalledItemId; import org.thingsboard.server.common.data.id.IotHubInstalledItemId;
import org.thingsboard.server.dao.device.DeviceConnectivityService;
import org.thingsboard.server.dao.iot_hub.IotHubInstalledItemService; import org.thingsboard.server.dao.iot_hub.IotHubInstalledItemService;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.security.system.SystemSecurityService;
import org.thingsboard.server.service.iot_hub.InstallItemVersionResult; import org.thingsboard.server.service.iot_hub.InstallItemVersionResult;
import org.thingsboard.server.service.iot_hub.UpdateItemVersionResult; import org.thingsboard.server.service.iot_hub.UpdateItemVersionResult;
import org.thingsboard.server.service.iot_hub.IotHubService; import org.thingsboard.server.service.iot_hub.IotHubService;
@ -56,6 +58,8 @@ public class IotHubController extends BaseController {
private final IotHubService iotHubService; private final IotHubService iotHubService;
private final IotHubInstalledItemService iotHubInstalledItemService; private final IotHubInstalledItemService iotHubInstalledItemService;
private final DeviceConnectivityService deviceConnectivityService;
private final SystemSecurityService systemSecurityService;
@PreAuthorize("hasAuthority('TENANT_ADMIN')") @PreAuthorize("hasAuthority('TENANT_ADMIN')")
@PostMapping("/versions/{versionId}/install") @PostMapping("/versions/{versionId}/install")
@ -119,4 +123,12 @@ public class IotHubController extends BaseController {
public void deleteInstalledItem(@PathVariable UUID installedItemId) throws ThingsboardException { public void deleteInstalledItem(@PathVariable UUID installedItemId) throws ThingsboardException {
iotHubService.deleteInstalledItem(getCurrentUser(), new IotHubInstalledItemId(installedItemId)); iotHubService.deleteInstalledItem(getCurrentUser(), new IotHubInstalledItemId(installedItemId));
} }
@PreAuthorize("hasAuthority('TENANT_ADMIN')")
@GetMapping("/connectivity")
@ResponseBody
public JsonNode getConnectivitySettings(HttpServletRequest request) throws Exception {
String baseUrl = systemSecurityService.getBaseUrl(getTenantId(), getCurrentUser().getCustomerId(), request);
return deviceConnectivityService.getConnectivityInfo(baseUrl);
}
} }

2
common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityService.java

@ -25,6 +25,8 @@ public interface DeviceConnectivityService {
JsonNode findDevicePublishTelemetryCommands(String baseUrl, Device device) throws URISyntaxException; JsonNode findDevicePublishTelemetryCommands(String baseUrl, Device device) throws URISyntaxException;
JsonNode getConnectivityInfo(String baseUrl) throws URISyntaxException;
Resource getPemCertFile(String protocol); Resource getPemCertFile(String protocol);
Resource createGatewayDockerComposeFile(String baseUrl, Device device) throws URISyntaxException; Resource createGatewayDockerComposeFile(String baseUrl, Device device) throws URISyntaxException;

18
dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityServiceImpl.java

@ -48,6 +48,7 @@ import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Base64; import java.util.Base64;
import java.util.List; import java.util.List;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -176,6 +177,23 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService
return info != null && info.isEnabled(); return info != null && info.isEnabled();
} }
@Override
public JsonNode getConnectivityInfo(String baseUrl) throws URISyntaxException {
String[] protocols = {HTTP, HTTPS, MQTT, MQTTS, COAP, COAPS};
Map<String, DeviceConnectivityInfo> result = new LinkedHashMap<>();
for (String protocol : protocols) {
DeviceConnectivityInfo info = getConnectivity(protocol);
if (info != null && info.isEnabled()) {
DeviceConnectivityInfo resolved = new DeviceConnectivityInfo();
resolved.setEnabled(true);
resolved.setHost(getHost(baseUrl, info, protocol));
resolved.setPort(getPort(info));
result.put(protocol, resolved);
}
}
return JacksonUtil.valueToTree(result);
}
private Resource getCert(String path) { private Resource getCert(String path) {
if (StringUtils.isBlank(path) || !ResourceUtils.resourceExists(this, path)) { if (StringUtils.isBlank(path) || !ResourceUtils.resourceExists(this, path)) {
return null; return null;

8
ui-ngx/src/app/core/http/iot-hub-api.service.ts

@ -27,6 +27,7 @@ import { InterceptorHttpParams } from '@core/interceptors/interceptor-http-param
import { InterceptorConfig } from '@core/interceptors/interceptor-config'; import { InterceptorConfig } from '@core/interceptors/interceptor-config';
import { AppState } from '@core/core.state'; import { AppState } from '@core/core.state';
import { getCurrentAuthState } from '@core/auth/auth.selectors'; import { getCurrentAuthState } from '@core/auth/auth.selectors';
import { DeviceConnectivitySettings } from '@shared/models/settings.models';
import { environment as env } from '@env/environment'; import { environment as env } from '@env/environment';
export function tbVersionToInt(version: string): number { export function tbVersionToInt(version: string): number {
@ -112,6 +113,13 @@ export class IotHubApiService {
); );
} }
public getConnectivitySettings(config?: IotHubRequestConfig): Observable<DeviceConnectivitySettings> {
return this.http.get<DeviceConnectivitySettings>(
`/api/iot-hub/connectivity`,
{ params: this.buildParams(config) }
);
}
public registerDeviceInstall( public registerDeviceInstall(
versionId: string, versionId: string,
descriptor: { type?: string; createdEntityIds: { entityType: string; id: string }[]; dashboardId?: { entityType: string; id: string } }, descriptor: { type?: string; createdEntityIds: { entityType: string; id: string }[]; dashboardId?: { entityType: string; id: string } },

8
ui-ngx/src/app/modules/home/components/iot-hub/device-install-dialog/device-install-dialog.component.ts

@ -30,8 +30,6 @@ import { DeviceProfileService } from '@core/http/device-profile.service';
import { DeviceService } from '@core/http/device.service'; import { DeviceService } from '@core/http/device.service';
import { DashboardService } from '@core/http/dashboard.service'; import { DashboardService } from '@core/http/dashboard.service';
import { RuleChainService } from '@core/http/rule-chain.service'; import { RuleChainService } from '@core/http/rule-chain.service';
import { AdminService } from '@core/http/admin.service';
import { DeviceConnectivitySettings } from '@shared/models/settings.models';
import { import {
connectivityTypeTranslations, connectivityTypeTranslations,
DeviceInstallStep, DeviceInstallStep,
@ -141,9 +139,9 @@ export class TbDeviceInstallDialogComponent extends DialogComponent<TbDeviceInst
} }
// Fetch transport connectivity settings for variable resolution // Fetch transport connectivity settings for variable resolution
try { try {
const settings = await firstValueFrom(this.adminService.getAdminSettings<DeviceConnectivitySettings>('connectivity')); const connectivity = await firstValueFrom(this.iotHubApiService.getConnectivitySettings({ ignoreErrors: true }));
if (settings?.jsonValue) { if (connectivity) {
for (const [protocol, info] of Object.entries(settings.jsonValue)) { for (const [protocol, info] of Object.entries(connectivity)) {
if (info) { if (info) {
this.transportVars[`${protocol}.host`] = info.host || ''; this.transportVars[`${protocol}.host`] = info.host || '';
this.transportVars[`${protocol}.port`] = String(info.port || ''); this.transportVars[`${protocol}.port`] = String(info.port || '');

Loading…
Cancel
Save