Merge remote-tracking branch 'origin/develop/3.3.2' into develop/3.3.3
This commit is contained in:
commit
a8371eaf88
@ -30,12 +30,10 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest;
|
import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest;
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig;
|
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MServerSecurityConfig;
|
||||||
import org.thingsboard.server.common.data.security.DeviceCredentials;
|
import org.thingsboard.server.common.data.security.DeviceCredentials;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
import org.thingsboard.server.service.lwm2m.LwM2MService;
|
import org.thingsboard.server.service.lwm2m.LwM2MService;
|
||||||
import org.thingsboard.server.service.lwm2m.LwM2MServiceImpl;
|
|
||||||
import org.thingsboard.server.service.security.permission.Resource;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -63,14 +61,14 @@ public class Lwm2mController extends BaseController {
|
|||||||
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/lwm2m/deviceProfile/bootstrap/{isBootstrapServer}", method = RequestMethod.GET)
|
@RequestMapping(value = "/lwm2m/deviceProfile/bootstrap/{isBootstrapServer}", method = RequestMethod.GET)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public ServerSecurityConfig getLwm2mBootstrapSecurityInfo(
|
public LwM2MServerSecurityConfig getLwm2mBootstrapSecurityInfo(
|
||||||
@ApiParam(value = IS_BOOTSTRAP_SERVER_PARAM_DESCRIPTION)
|
@ApiParam(value = IS_BOOTSTRAP_SERVER_PARAM_DESCRIPTION)
|
||||||
@PathVariable(IS_BOOTSTRAP_SERVER) boolean bootstrapServer) throws ThingsboardException {
|
@PathVariable(IS_BOOTSTRAP_SERVER) boolean bootstrapServer) throws ThingsboardException {
|
||||||
try {
|
try {
|
||||||
return lwM2MService.getServerSecurityInfo(bootstrapServer);
|
return lwM2MService.getServerSecurityInfo(bootstrapServer);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw handleException(e);
|
throw handleException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(hidden = true, value = "Save device with credentials (Deprecated)")
|
@ApiOperation(hidden = true, value = "Save device with credentials (Deprecated)")
|
||||||
|
|||||||
@ -15,10 +15,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.lwm2m;
|
package org.thingsboard.server.service.lwm2m;
|
||||||
|
|
||||||
import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig;
|
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MServerSecurityConfig;
|
||||||
|
|
||||||
public interface LwM2MService {
|
public interface LwM2MService {
|
||||||
|
|
||||||
ServerSecurityConfig getServerSecurityInfo(boolean bootstrapServer);
|
LwM2MServerSecurityConfig getServerSecurityInfo(boolean bootstrapServer);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig;
|
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MServerSecurityConfig;
|
||||||
import org.thingsboard.server.common.transport.config.ssl.SslCredentials;
|
import org.thingsboard.server.common.transport.config.ssl.SslCredentials;
|
||||||
import org.thingsboard.server.transport.lwm2m.config.LwM2MSecureServerConfig;
|
import org.thingsboard.server.transport.lwm2m.config.LwM2MSecureServerConfig;
|
||||||
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportBootstrapConfig;
|
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportBootstrapConfig;
|
||||||
@ -36,15 +36,15 @@ public class LwM2MServiceImpl implements LwM2MService {
|
|||||||
private final LwM2MTransportBootstrapConfig bootstrapConfig;
|
private final LwM2MTransportBootstrapConfig bootstrapConfig;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ServerSecurityConfig getServerSecurityInfo(boolean bootstrapServer) {
|
public LwM2MServerSecurityConfig getServerSecurityInfo(boolean bootstrapServer) {
|
||||||
ServerSecurityConfig result = getServerSecurityConfig(bootstrapServer ? bootstrapConfig : serverConfig);
|
LwM2MServerSecurityConfig result = getServerSecurityConfig(bootstrapServer ? bootstrapConfig : serverConfig);
|
||||||
result.setBootstrapServerIs(bootstrapServer);
|
result.setBootstrapServerIs(bootstrapServer);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ServerSecurityConfig getServerSecurityConfig(LwM2MSecureServerConfig serverConfig) {
|
private LwM2MServerSecurityConfig getServerSecurityConfig(LwM2MSecureServerConfig serverConfig) {
|
||||||
ServerSecurityConfig bsServ = new ServerSecurityConfig();
|
LwM2MServerSecurityConfig bsServ = new LwM2MServerSecurityConfig();
|
||||||
bsServ.setServerId(serverConfig.getId());
|
bsServ.setShortServerId(serverConfig.getId());
|
||||||
bsServ.setHost(serverConfig.getHost());
|
bsServ.setHost(serverConfig.getHost());
|
||||||
bsServ.setPort(serverConfig.getPort());
|
bsServ.setPort(serverConfig.getPort());
|
||||||
bsServ.setSecurityHost(serverConfig.getSecureHost());
|
bsServ.setSecurityHost(serverConfig.getSecureHost());
|
||||||
|
|||||||
@ -15,10 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.dao.device;
|
package org.thingsboard.server.dao.device;
|
||||||
|
|
||||||
import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration;
|
|
||||||
import org.thingsboard.server.common.data.id.DeviceId;
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig;
|
|
||||||
import org.thingsboard.server.common.data.security.DeviceCredentials;
|
import org.thingsboard.server.common.data.security.DeviceCredentials;
|
||||||
|
|
||||||
public interface DeviceCredentialsService {
|
public interface DeviceCredentialsService {
|
||||||
|
|||||||
@ -20,11 +20,10 @@ import lombok.Getter;
|
|||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig;
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public abstract class AbstractLwM2MBootstrapServerCredential extends ServerSecurityConfig implements LwM2MBootstrapServerCredential {
|
public abstract class AbstractLwM2MBootstrapServerCredential extends LwM2MServerSecurityConfig implements LwM2MBootstrapServerCredential {
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public byte[] getDecodedCServerPublicKey() {
|
public byte[] getDecodedCServerPublicKey() {
|
||||||
|
|||||||
@ -1,27 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2021 The Thingsboard Authors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class LwM2MBootstrapServerConfig {
|
|
||||||
private Integer shortId = 123;
|
|
||||||
private Integer lifetime = 300;
|
|
||||||
private Integer defaultMinPeriod = 1;
|
|
||||||
private boolean notifIfDisabled = true;
|
|
||||||
private String binding = "U";
|
|
||||||
}
|
|
||||||
@ -17,15 +17,11 @@ package org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap;
|
|||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class LwM2MBootstrapServersConfiguration {
|
public class LwM2MBootstrapServersConfiguration {
|
||||||
|
|
||||||
//TODO
|
List<LwM2MBootstrapServerCredential> serverConfiguration;
|
||||||
// List <LwM2MBootstrapServersConfiguration> LwM2MBootstrapServersConfigurations;
|
|
||||||
// LwM2MBootstrapServersConfiguration: Integer shortId, LwM2MBootstrapServerConfig serverConfig; LwM2MBootstrapServerCredential serverSecurity.
|
|
||||||
|
|
||||||
private LwM2MBootstrapServerConfig servers;
|
|
||||||
private LwM2MBootstrapServerCredential lwm2mServer;
|
|
||||||
private LwM2MBootstrapServerCredential bootstrapServer;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,63 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2021 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@ApiModel
|
||||||
|
@Data
|
||||||
|
public class LwM2MServerSecurityConfig {
|
||||||
|
|
||||||
|
@ApiModelProperty(position = 1, value = "Server short Id. Used as link to associate server Object Instance.\nThis identifier uniquely identifies each LwM2M Server configured for the LwM2M Client.\n" +
|
||||||
|
"This Resource MUST be set when the Bootstrap-Server Resource has a value of 'false'. \n" +
|
||||||
|
"The values ID:0 and ID:65535 values MUST NOT be used for identifying the LwM2M Server.", example = "123", readOnly = true)
|
||||||
|
protected Integer shortServerId = 123;
|
||||||
|
/** Security -> ObjectId = 0 'LWM2M Security' */
|
||||||
|
@ApiModelProperty(position = 2, value = "Is Bootstrap Server or Lwm2m Server", example = "true or false", readOnly = true)
|
||||||
|
protected boolean bootstrapServerIs = false;
|
||||||
|
@ApiModelProperty(position = 3, value = "Host for 'No Security' mode", example = "0.0.0.0", readOnly = true)
|
||||||
|
protected String host;
|
||||||
|
@ApiModelProperty(position = 4, value = "Port for Lwm2m Server: 'No Security' mode: Lwm2m Server or Bootstrap Server", example = "'5685' or '5687'", readOnly = true)
|
||||||
|
protected Integer port;
|
||||||
|
@ApiModelProperty(position = 5, value = "Host for 'Security' mode (DTLS)", example = "0.0.0.0", readOnly = true)
|
||||||
|
protected String securityHost;
|
||||||
|
@ApiModelProperty(position = 6, value = "Port for 'Security' mode (DTLS): Lwm2m Server or Bootstrap Server", example = "5686 or 5688", readOnly = true)
|
||||||
|
protected Integer securityPort;
|
||||||
|
@ApiModelProperty(position = 7, value = "Client Hold Off Time. The number of seconds to wait before initiating a Client Initiated Bootstrap once the LwM2M Client has determined it should initiate this bootstrap mode. (This information is relevant for use with a Bootstrap-Server only.)", example = "1", readOnly = true)
|
||||||
|
protected Integer clientHoldOffTime = 1;
|
||||||
|
@ApiModelProperty(position = 8, value = "Server Public Key for 'Security' mode (DTLS): RPK or X509. Format: base64 encoded", example = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAZ0pSaGKHk/GrDaUDnQZpeEdGwX7m3Ws+U/kiVat\n" +
|
||||||
|
"+44sgk3c8g0LotfMpLlZJPhPwJ6ipXV+O1r7IZUjBs3LNA==", readOnly = true)
|
||||||
|
protected String serverPublicKey;
|
||||||
|
@ApiModelProperty(position = 9, value = "Bootstrap Server Account Timeout (If the value is set to 0, or if this resource is not instantiated, the Bootstrap-Server Account lifetime is infinite.)", example = "0", readOnly = true)
|
||||||
|
Integer bootstrapServerAccountTimeout = 0;
|
||||||
|
|
||||||
|
/** Config -> ObjectId = 1 'LwM2M Server' */
|
||||||
|
@ApiModelProperty(position = 10, value = "Specify the lifetime of the registration in seconds.", example = "300", readOnly = true)
|
||||||
|
private Integer lifetime = 300;
|
||||||
|
@ApiModelProperty(position = 11, value = "The default value the LwM2M Client should use for the Minimum Period of an Observation in the absence of this parameter being included in an Observation.\n" +
|
||||||
|
"If this Resource doesn’t exist, the default value is 0.", example = "1", readOnly = true)
|
||||||
|
private Integer defaultMinPeriod = 1;
|
||||||
|
/** ResourceID=6 'Notification Storing When Disabled or Offline' */
|
||||||
|
@ApiModelProperty(position = 12, value = "If true, the LwM2M Client stores “Notify” operations to the LwM2M Server while the LwM2M Server account is disabled or the LwM2M Client is offline. After the LwM2M Server account is enabled or the LwM2M Client is online, the LwM2M Client reports the stored “Notify” operations to the Server.\n" +
|
||||||
|
"If false, the LwM2M Client discards all the “Notify” operations or temporarily disables the Observe function while the LwM2M Server is disabled or the LwM2M Client is offline.\n" +
|
||||||
|
"The default value is true.", example = "true", readOnly = true)
|
||||||
|
private boolean notifIfDisabled = true;
|
||||||
|
@ApiModelProperty(position = 14, value = "This Resource defines the transport binding configured for the LwM2M Client.\n" +
|
||||||
|
"If the LwM2M Client supports the binding specified in this Resource, the LwM2M Client MUST use that transport for the Current Binding Mode.", example = "U", readOnly = true)
|
||||||
|
private String binding = "U";
|
||||||
|
}
|
||||||
@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2021 The Thingsboard Authors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.thingsboard.server.common.data.lwm2m;
|
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
@ApiModel
|
|
||||||
@Data
|
|
||||||
public class ServerSecurityConfig {
|
|
||||||
@ApiModelProperty(position = 1, value = "Is Bootstrap Server or Lwm2m Server", example = "true or false", readOnly = true)
|
|
||||||
protected boolean bootstrapServerIs = true;
|
|
||||||
@ApiModelProperty(position = 2, value = "Host for 'No Security' mode", example = "0.0.0.0", readOnly = true)
|
|
||||||
protected String host;
|
|
||||||
@ApiModelProperty(position = 3, value = "Port for Lwm2m Server: 'No Security' mode: Lwm2m Server or Bootstrap Server", example = "'5685' or '5687'", readOnly = true)
|
|
||||||
protected Integer port;
|
|
||||||
@ApiModelProperty(position = 4, value = "Host for 'Security' mode (DTLS)", example = "0.0.0.0", readOnly = true)
|
|
||||||
protected String securityHost;
|
|
||||||
@ApiModelProperty(position = 5, value = "Port for 'Security' mode (DTLS): Lwm2m Server or Bootstrap Server", example = "5686 or 5688", readOnly = true)
|
|
||||||
protected Integer securityPort;
|
|
||||||
@ApiModelProperty(position = 6, value = "Server short Id", example = "111", readOnly = true)
|
|
||||||
protected Integer serverId = 111;
|
|
||||||
@ApiModelProperty(position = 7, value = "Client Hold Off Time. The number of seconds to wait before initiating a Client Initiated Bootstrap once the LwM2M Client has determined it should initiate this bootstrap mode. (This information is relevant for use with a Bootstrap-Server only.)", example = "1", readOnly = true)
|
|
||||||
protected Integer clientHoldOffTime = 1;
|
|
||||||
@ApiModelProperty(position = 8, value = "Server Public Key for 'Security' mode (DTLS): RPK or X509. Format: base64 encoded", example = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAZ0pSaGKHk/GrDaUDnQZpeEdGwX7m3Ws+U/kiVat\n" +
|
|
||||||
"+44sgk3c8g0LotfMpLlZJPhPwJ6ipXV+O1r7IZUjBs3LNA==", readOnly = true)
|
|
||||||
protected String serverPublicKey;
|
|
||||||
@ApiModelProperty(position = 9, value = "Bootstrap Server Account Timeout (If the value is set to 0, or if this resource is not instantiated, the Bootstrap-Server Account lifetime is infinite.)", example = "0", readOnly = true)
|
|
||||||
Integer bootstrapServerAccountTimeout = 0;
|
|
||||||
}
|
|
||||||
@ -23,12 +23,18 @@ import org.eclipse.leshan.core.SecurityMode;
|
|||||||
import org.eclipse.leshan.core.request.BindingMode;
|
import org.eclipse.leshan.core.request.BindingMode;
|
||||||
import org.eclipse.leshan.core.util.Hex;
|
import org.eclipse.leshan.core.util.Hex;
|
||||||
import org.eclipse.leshan.server.bootstrap.BootstrapConfig;
|
import org.eclipse.leshan.server.bootstrap.BootstrapConfig;
|
||||||
|
import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MBootstrapClientCredential;
|
||||||
|
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServerCredential;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class LwM2MBootstrapConfig implements Serializable {
|
public class LwM2MBootstrapConfig implements Serializable {
|
||||||
|
|
||||||
|
List<LwM2MBootstrapServerCredential> serversConfiguration;
|
||||||
|
LwM2MBootstrapClientCredential bootstrapClientCredential;
|
||||||
/*
|
/*
|
||||||
interface BootstrapSecurityConfig
|
interface BootstrapSecurityConfig
|
||||||
servers: BootstrapServersSecurityConfig,
|
servers: BootstrapServersSecurityConfig,
|
||||||
@ -68,6 +74,11 @@ public class LwM2MBootstrapConfig implements Serializable {
|
|||||||
@Setter
|
@Setter
|
||||||
private LwM2MServerBootstrap lwm2mServer;
|
private LwM2MServerBootstrap lwm2mServer;
|
||||||
|
|
||||||
|
public LwM2MBootstrapConfig(List<LwM2MBootstrapServerCredential> serversConfiguration, LwM2MBootstrapClientCredential bootstrapClientCredential) {
|
||||||
|
this.serversConfiguration = serversConfiguration;
|
||||||
|
this.bootstrapClientCredential = bootstrapClientCredential;
|
||||||
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public BootstrapConfig getLwM2MBootstrapConfig() {
|
public BootstrapConfig getLwM2MBootstrapConfig() {
|
||||||
BootstrapConfig configBs = new BootstrapConfig();
|
BootstrapConfig configBs = new BootstrapConfig();
|
||||||
|
|||||||
@ -419,8 +419,9 @@ public class DeviceProfileServiceImpl extends AbstractEntityService implements D
|
|||||||
}
|
}
|
||||||
} else if (transportConfiguration instanceof Lwm2mDeviceProfileTransportConfiguration) {
|
} else if (transportConfiguration instanceof Lwm2mDeviceProfileTransportConfiguration) {
|
||||||
LwM2MBootstrapServersConfiguration lwM2MBootstrapServersConfiguration = ((Lwm2mDeviceProfileTransportConfiguration) transportConfiguration).getBootstrap();
|
LwM2MBootstrapServersConfiguration lwM2MBootstrapServersConfiguration = ((Lwm2mDeviceProfileTransportConfiguration) transportConfiguration).getBootstrap();
|
||||||
validateLwm2mServersCredentialOfBootstrapForClient(lwM2MBootstrapServersConfiguration.getBootstrapServer(), "Bootstrap Server");
|
for (LwM2MBootstrapServerCredential bootstrapServerCredential : lwM2MBootstrapServersConfiguration.getServerConfiguration()) {
|
||||||
validateLwm2mServersCredentialOfBootstrapForClient(lwM2MBootstrapServersConfiguration.getLwm2mServer(), "LwM2M Server");
|
validateLwm2mServersCredentialOfBootstrapForClient(bootstrapServerCredential);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<DeviceProfileAlarm> profileAlarms = deviceProfile.getProfileData().getAlarms();
|
List<DeviceProfileAlarm> profileAlarms = deviceProfile.getProfileData().getAlarms();
|
||||||
@ -704,13 +705,15 @@ public class DeviceProfileServiceImpl extends AbstractEntityService implements D
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateLwm2mServersCredentialOfBootstrapForClient(LwM2MBootstrapServerCredential bootstrapServerConfig, String server) {
|
private void validateLwm2mServersCredentialOfBootstrapForClient(LwM2MBootstrapServerCredential bootstrapServerConfig) {
|
||||||
|
String server;
|
||||||
switch (bootstrapServerConfig.getSecurityMode()) {
|
switch (bootstrapServerConfig.getSecurityMode()) {
|
||||||
case NO_SEC:
|
case NO_SEC:
|
||||||
case PSK:
|
case PSK:
|
||||||
break;
|
break;
|
||||||
case RPK:
|
case RPK:
|
||||||
RPKLwM2MBootstrapServerCredential rpkServerCredentials = (RPKLwM2MBootstrapServerCredential) bootstrapServerConfig;
|
RPKLwM2MBootstrapServerCredential rpkServerCredentials = (RPKLwM2MBootstrapServerCredential) bootstrapServerConfig;
|
||||||
|
server = rpkServerCredentials.isBootstrapServerIs() ? "Bootstrap Server" : "LwM2M Server";
|
||||||
if (StringUtils.isEmpty(rpkServerCredentials.getServerPublicKey())) {
|
if (StringUtils.isEmpty(rpkServerCredentials.getServerPublicKey())) {
|
||||||
throw new DeviceCredentialsValidationException(server + " RPK public key must be specified!");
|
throw new DeviceCredentialsValidationException(server + " RPK public key must be specified!");
|
||||||
}
|
}
|
||||||
@ -724,6 +727,7 @@ public class DeviceProfileServiceImpl extends AbstractEntityService implements D
|
|||||||
break;
|
break;
|
||||||
case X509:
|
case X509:
|
||||||
X509LwM2MBootstrapServerCredential x509ServerCredentials = (X509LwM2MBootstrapServerCredential) bootstrapServerConfig;
|
X509LwM2MBootstrapServerCredential x509ServerCredentials = (X509LwM2MBootstrapServerCredential) bootstrapServerConfig;
|
||||||
|
server = x509ServerCredentials.isBootstrapServerIs() ? "Bootstrap Server" : "LwM2M Server";
|
||||||
if (StringUtils.isEmpty(x509ServerCredentials.getServerPublicKey())) {
|
if (StringUtils.isEmpty(x509ServerCredentials.getServerPublicKey())) {
|
||||||
throw new DeviceCredentialsValidationException(server + " X509 public key must be specified!");
|
throw new DeviceCredentialsValidationException(server + " X509 public key must be specified!");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,13 +24,13 @@ import { DeviceProfile, DeviceProfileInfo, DeviceTransportType } from '@shared/m
|
|||||||
import { deepClone, isDefinedAndNotNull, isEmptyStr } from '@core/utils';
|
import { deepClone, isDefinedAndNotNull, isEmptyStr } from '@core/utils';
|
||||||
import {
|
import {
|
||||||
ObjectLwM2M,
|
ObjectLwM2M,
|
||||||
securityConfigMode,
|
|
||||||
ServerSecurityConfig,
|
ServerSecurityConfig,
|
||||||
ServerSecurityConfigInfo
|
ServerSecurityConfigInfo
|
||||||
} from '@home/components/profile/device/lwm2m/lwm2m-profile-config.models';
|
} from '@home/components/profile/device/lwm2m/lwm2m-profile-config.models';
|
||||||
import { SortOrder } from '@shared/models/page/sort-order';
|
import { SortOrder } from '@shared/models/page/sort-order';
|
||||||
import { OtaPackageService } from '@core/http/ota-package.service';
|
import { OtaPackageService } from '@core/http/ota-package.service';
|
||||||
import { map, mergeMap, tap } from 'rxjs/operators';
|
import { map, mergeMap, tap } from 'rxjs/operators';
|
||||||
|
import { Lwm2mSecurityType } from '@shared/models/lwm2m-security-config.models';
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
@ -79,23 +79,23 @@ export class DeviceProfileService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public getLwm2mBootstrapSecurityInfoBySecurityType(isBootstrapServer: boolean, securityMode = securityConfigMode.NO_SEC,
|
public getLwm2mBootstrapSecurityInfoBySecurityType(isBootstrapServer: boolean, securityMode = Lwm2mSecurityType.NO_SEC,
|
||||||
config?: RequestConfig): Observable<ServerSecurityConfig> {
|
config?: RequestConfig): Observable<ServerSecurityConfig> {
|
||||||
return this.getLwm2mBootstrapSecurityInfo(isBootstrapServer, config).pipe(
|
return this.getLwm2mBootstrapSecurityInfo(isBootstrapServer, config).pipe(
|
||||||
map(securityConfig => {
|
map(securityConfig => {
|
||||||
const serverSecurityConfigInfo = deepClone(securityConfig);
|
const serverSecurityConfigInfo = deepClone(securityConfig);
|
||||||
switch (securityMode) {
|
switch (securityMode) {
|
||||||
case securityConfigMode.PSK:
|
case Lwm2mSecurityType.PSK:
|
||||||
serverSecurityConfigInfo.port = serverSecurityConfigInfo.securityPort;
|
serverSecurityConfigInfo.port = serverSecurityConfigInfo.securityPort;
|
||||||
serverSecurityConfigInfo.host = serverSecurityConfigInfo.securityHost;
|
serverSecurityConfigInfo.host = serverSecurityConfigInfo.securityHost;
|
||||||
serverSecurityConfigInfo.serverPublicKey = '';
|
serverSecurityConfigInfo.serverPublicKey = '';
|
||||||
break;
|
break;
|
||||||
case securityConfigMode.RPK:
|
case Lwm2mSecurityType.RPK:
|
||||||
case securityConfigMode.X509:
|
case Lwm2mSecurityType.X509:
|
||||||
serverSecurityConfigInfo.port = serverSecurityConfigInfo.securityPort;
|
serverSecurityConfigInfo.port = serverSecurityConfigInfo.securityPort;
|
||||||
serverSecurityConfigInfo.host = serverSecurityConfigInfo.securityHost;
|
serverSecurityConfigInfo.host = serverSecurityConfigInfo.securityHost;
|
||||||
break;
|
break;
|
||||||
case securityConfigMode.NO_SEC:
|
case Lwm2mSecurityType.NO_SEC:
|
||||||
serverSecurityConfigInfo.serverPublicKey = '';
|
serverSecurityConfigInfo.serverPublicKey = '';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,6 +27,8 @@
|
|||||||
<div [fxShow]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC">
|
<div [fxShow]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC">
|
||||||
<mat-form-field class="mat-block">
|
<mat-form-field class="mat-block">
|
||||||
<mat-label>{{ 'device.lwm2m-security-config.client-publicKey-or-id' | translate }}</mat-label>
|
<mat-label>{{ 'device.lwm2m-security-config.client-publicKey-or-id' | translate }}</mat-label>
|
||||||
|
<mat-icon class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
|
matTooltip="{{ publicKeyOrIdTooltipNamesMap.get(serverFormGroup.get('securityMode').value) | translate }}">help</mat-icon>
|
||||||
<textarea matInput
|
<textarea matInput
|
||||||
cdkTextareaAutosize
|
cdkTextareaAutosize
|
||||||
cdkAutosizeMinRows="1"
|
cdkAutosizeMinRows="1"
|
||||||
@ -40,6 +42,8 @@
|
|||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field class="mat-block">
|
<mat-form-field class="mat-block">
|
||||||
<mat-label>{{ 'device.lwm2m-security-config.client-secret-key' | translate }}</mat-label>
|
<mat-label>{{ 'device.lwm2m-security-config.client-secret-key' | translate }}</mat-label>
|
||||||
|
<mat-icon class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
|
matTooltip="{{ clientSecretKeyTooltipNamesMap.get(serverFormGroup.get('securityMode').value) | translate }}">help</mat-icon>
|
||||||
<textarea matInput
|
<textarea matInput
|
||||||
cdkTextareaAutosize
|
cdkTextareaAutosize
|
||||||
cdkAutosizeMinRows="1"
|
cdkAutosizeMinRows="1"
|
||||||
|
|||||||
@ -26,6 +26,8 @@ import {
|
|||||||
Validators
|
Validators
|
||||||
} from '@angular/forms';
|
} from '@angular/forms';
|
||||||
import {
|
import {
|
||||||
|
Lwm2mClientSecretKeyTooltipTranslationsMap,
|
||||||
|
Lwm2mPublicKeyOrIdTooltipTranslationsMap,
|
||||||
Lwm2mSecurityType,
|
Lwm2mSecurityType,
|
||||||
Lwm2mSecurityTypeTranslationMap,
|
Lwm2mSecurityTypeTranslationMap,
|
||||||
ServerSecurityConfig
|
ServerSecurityConfig
|
||||||
@ -57,6 +59,8 @@ export class DeviceCredentialsLwm2mServerComponent implements OnDestroy, Control
|
|||||||
securityConfigLwM2MType = Lwm2mSecurityType;
|
securityConfigLwM2MType = Lwm2mSecurityType;
|
||||||
securityConfigLwM2MTypes = Object.values(Lwm2mSecurityType);
|
securityConfigLwM2MTypes = Object.values(Lwm2mSecurityType);
|
||||||
lwm2mSecurityTypeTranslationMap = Lwm2mSecurityTypeTranslationMap;
|
lwm2mSecurityTypeTranslationMap = Lwm2mSecurityTypeTranslationMap;
|
||||||
|
publicKeyOrIdTooltipNamesMap = Lwm2mPublicKeyOrIdTooltipTranslationsMap;
|
||||||
|
clientSecretKeyTooltipNamesMap = Lwm2mClientSecretKeyTooltipTranslationsMap;
|
||||||
|
|
||||||
private destroy$ = new Subject();
|
private destroy$ = new Subject();
|
||||||
private propagateChange = (v: any) => {};
|
private propagateChange = (v: any) => {};
|
||||||
|
|||||||
@ -34,8 +34,11 @@
|
|||||||
</mat-option>
|
</mat-option>
|
||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field class="mat-block" *ngIf="lwm2mConfigFormGroup.get('client.securityConfigClientMode').value === securityConfigLwM2MType.PSK">
|
<mat-form-field class="mat-block"
|
||||||
|
*ngIf="lwm2mConfigFormGroup.get('client.securityConfigClientMode').value === securityConfigLwM2MType.PSK">
|
||||||
<mat-label>{{ 'device.lwm2m-security-config.identity' | translate }}</mat-label>
|
<mat-label>{{ 'device.lwm2m-security-config.identity' | translate }}</mat-label>
|
||||||
|
<mat-icon class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
|
matTooltip="{{ 'device.lwm2m-security-config.identity-tooltip' | translate }}">help</mat-icon>
|
||||||
<input matInput type="text" formControlName="identity" required>
|
<input matInput type="text" formControlName="identity" required>
|
||||||
<mat-error *ngIf="lwm2mConfigFormGroup.get('client.identity').hasError('required')">
|
<mat-error *ngIf="lwm2mConfigFormGroup.get('client.identity').hasError('required')">
|
||||||
{{ 'device.lwm2m-security-config.identity-required' | translate }}
|
{{ 'device.lwm2m-security-config.identity-required' | translate }}
|
||||||
@ -44,6 +47,8 @@
|
|||||||
<mat-form-field class="mat-block" *ngIf="lwm2mConfigFormGroup.get('client.securityConfigClientMode').value === securityConfigLwM2MType.RPK ||
|
<mat-form-field class="mat-block" *ngIf="lwm2mConfigFormGroup.get('client.securityConfigClientMode').value === securityConfigLwM2MType.RPK ||
|
||||||
lwm2mConfigFormGroup.get('client.securityConfigClientMode').value === securityConfigLwM2MType.PSK">
|
lwm2mConfigFormGroup.get('client.securityConfigClientMode').value === securityConfigLwM2MType.PSK">
|
||||||
<mat-label>{{ 'device.lwm2m-security-config.client-key' | translate }}</mat-label>
|
<mat-label>{{ 'device.lwm2m-security-config.client-key' | translate }}</mat-label>
|
||||||
|
<mat-icon class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
|
matTooltip="{{ clientKeyTooltipNamesMap.get(lwm2mConfigFormGroup.get('client.securityConfigClientMode').value) | translate }}">help</mat-icon>
|
||||||
<textarea matInput
|
<textarea matInput
|
||||||
cdkTextareaAutosize
|
cdkTextareaAutosize
|
||||||
cdkAutosizeMinRows="1"
|
cdkAutosizeMinRows="1"
|
||||||
@ -57,6 +62,8 @@
|
|||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field class="mat-block" *ngIf="lwm2mConfigFormGroup.get('client.securityConfigClientMode').value === securityConfigLwM2MType.X509">
|
<mat-form-field class="mat-block" *ngIf="lwm2mConfigFormGroup.get('client.securityConfigClientMode').value === securityConfigLwM2MType.X509">
|
||||||
<mat-label translate>device.lwm2m-security-config.client-public-key</mat-label>
|
<mat-label translate>device.lwm2m-security-config.client-public-key</mat-label>
|
||||||
|
<mat-icon *ngIf="lwm2mConfigFormGroup.get('client.cert').value" class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
|
matTooltip="{{ 'device.lwm2m-security-config.client-public-key-tooltip' | translate }}">help</mat-icon>
|
||||||
<textarea matInput
|
<textarea matInput
|
||||||
cdkTextareaAutosize
|
cdkTextareaAutosize
|
||||||
cdkAutosizeMinRows="1"
|
cdkAutosizeMinRows="1"
|
||||||
|
|||||||
@ -27,7 +27,7 @@ import {
|
|||||||
} from '@angular/forms';
|
} from '@angular/forms';
|
||||||
import {
|
import {
|
||||||
getDefaultClientSecurityConfig,
|
getDefaultClientSecurityConfig,
|
||||||
getDefaultServerSecurityConfig,
|
getDefaultServerSecurityConfig, Lwm2mClientKeyTooltipTranslationsMap,
|
||||||
Lwm2mSecurityConfigModels,
|
Lwm2mSecurityConfigModels,
|
||||||
Lwm2mSecurityType,
|
Lwm2mSecurityType,
|
||||||
Lwm2mSecurityTypeTranslationMap
|
Lwm2mSecurityTypeTranslationMap
|
||||||
@ -60,6 +60,7 @@ export class DeviceCredentialsLwm2mComponent implements ControlValueAccessor, Va
|
|||||||
securityConfigLwM2MType = Lwm2mSecurityType;
|
securityConfigLwM2MType = Lwm2mSecurityType;
|
||||||
securityConfigLwM2MTypes = Object.keys(Lwm2mSecurityType);
|
securityConfigLwM2MTypes = Object.keys(Lwm2mSecurityType);
|
||||||
credentialTypeLwM2MNamesMap = Lwm2mSecurityTypeTranslationMap;
|
credentialTypeLwM2MNamesMap = Lwm2mSecurityTypeTranslationMap;
|
||||||
|
clientKeyTooltipNamesMap = Lwm2mClientKeyTooltipTranslationsMap;
|
||||||
|
|
||||||
private destroy$ = new Subject();
|
private destroy$ = new Subject();
|
||||||
private propagateChange = (v: any) => {};
|
private propagateChange = (v: any) => {};
|
||||||
|
|||||||
@ -51,6 +51,8 @@
|
|||||||
<div fxLayout="row" fxLayout.xs="column" fxLayoutGap="8px" fxLayoutGap.xs="0px">
|
<div fxLayout="row" fxLayout.xs="column" fxLayoutGap="8px" fxLayoutGap.xs="0px">
|
||||||
<mat-form-field fxFlex>
|
<mat-form-field fxFlex>
|
||||||
<mat-label>{{ 'device-profile.lwm2m.short-id' | translate }}</mat-label>
|
<mat-label>{{ 'device-profile.lwm2m.short-id' | translate }}</mat-label>
|
||||||
|
<mat-icon *ngIf="!disabled" class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
|
matTooltip="{{'device-profile.lwm2m.short-id-tooltip' | translate }}">help</mat-icon>
|
||||||
<input matInput type="number" min="1" max="65534" formControlName="serverId" required>
|
<input matInput type="number" min="1" max="65534" formControlName="serverId" required>
|
||||||
<mat-error *ngIf="serverFormGroup.get('serverId').hasError('required')">
|
<mat-error *ngIf="serverFormGroup.get('serverId').hasError('required')">
|
||||||
{{ 'device-profile.lwm2m.short-id-required' | translate }}
|
{{ 'device-profile.lwm2m.short-id-required' | translate }}
|
||||||
@ -65,9 +67,9 @@
|
|||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex>
|
<mat-form-field fxFlex>
|
||||||
<mat-label>{{ 'device-profile.lwm2m.client-hold-off-time' | translate }}</mat-label>
|
<mat-label>{{ 'device-profile.lwm2m.client-hold-off-time' | translate }}</mat-label>
|
||||||
<input matInput type="number" formControlName="clientHoldOffTime" required min="0"
|
<mat-icon *ngIf="!disabled" class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
matTooltip="{{'device-profile.lwm2m.client-hold-off-time-tooltip' | translate}}"
|
matTooltip="{{'device-profile.lwm2m.client-hold-off-time-tooltip' | translate }}">help</mat-icon>
|
||||||
matTooltipPosition="above">
|
<input matInput type="number" formControlName="clientHoldOffTime" required min="0">
|
||||||
<mat-error *ngIf="serverFormGroup.get('clientHoldOffTime').hasError('required')">
|
<mat-error *ngIf="serverFormGroup.get('clientHoldOffTime').hasError('required')">
|
||||||
{{ 'device-profile.lwm2m.client-hold-off-time-required' | translate }}
|
{{ 'device-profile.lwm2m.client-hold-off-time-required' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
@ -78,9 +80,9 @@
|
|||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex>
|
<mat-form-field fxFlex>
|
||||||
<mat-label>{{ 'device-profile.lwm2m.account-after-timeout' | translate }}</mat-label>
|
<mat-label>{{ 'device-profile.lwm2m.account-after-timeout' | translate }}</mat-label>
|
||||||
<input matInput type="number" formControlName="bootstrapServerAccountTimeout" required min="0"
|
<mat-icon *ngIf="!disabled" class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
matTooltip="{{'device-profile.lwm2m.account-after-timeout-tooltip' | translate}}"
|
matTooltip="{{'device-profile.lwm2m.account-after-timeout-tooltip' | translate }}">help</mat-icon>
|
||||||
matTooltipPosition="above">
|
<input matInput type="number" formControlName="bootstrapServerAccountTimeout" required min="0">
|
||||||
<mat-error *ngIf="serverFormGroup.get('bootstrapServerAccountTimeout').hasError('required')">
|
<mat-error *ngIf="serverFormGroup.get('bootstrapServerAccountTimeout').hasError('required')">
|
||||||
{{ 'device-profile.lwm2m.account-after-timeout-required' | translate }}
|
{{ 'device-profile.lwm2m.account-after-timeout-required' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
@ -94,12 +96,15 @@
|
|||||||
serverFormGroup.get('securityMode').value === securityConfigLwM2MType.X509">
|
serverFormGroup.get('securityMode').value === securityConfigLwM2MType.X509">
|
||||||
<mat-form-field class="mat-block">
|
<mat-form-field class="mat-block">
|
||||||
<mat-label>{{ 'device-profile.lwm2m.server-public-key' | translate }}</mat-label>
|
<mat-label>{{ 'device-profile.lwm2m.server-public-key' | translate }}</mat-label>
|
||||||
|
<mat-icon *ngIf="!disabled" class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
|
matTooltip="{{ publicKeyOrIdTooltipNamesMap.get(serverFormGroup.get('securityMode').value) | translate }}">help</mat-icon>
|
||||||
<textarea matInput
|
<textarea matInput
|
||||||
cdkTextareaAutosize
|
cdkTextareaAutosize
|
||||||
cdkAutosizeMinRows="1"
|
cdkAutosizeMinRows="1"
|
||||||
cols="1" required
|
cols="1" required
|
||||||
formControlName="serverPublicKey"
|
formControlName="serverPublicKey"
|
||||||
></textarea>
|
required>
|
||||||
|
</textarea>
|
||||||
<mat-error *ngIf="serverFormGroup.get('serverPublicKey').hasError('required')">
|
<mat-error *ngIf="serverFormGroup.get('serverPublicKey').hasError('required')">
|
||||||
{{ 'device-profile.lwm2m.server-public-key-required' | translate }}
|
{{ 'device-profile.lwm2m.server-public-key-required' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
|
|||||||
@ -28,14 +28,17 @@ import {
|
|||||||
import {
|
import {
|
||||||
DEFAULT_PORT_BOOTSTRAP_NO_SEC,
|
DEFAULT_PORT_BOOTSTRAP_NO_SEC,
|
||||||
DEFAULT_PORT_SERVER_NO_SEC,
|
DEFAULT_PORT_SERVER_NO_SEC,
|
||||||
securityConfigMode,
|
|
||||||
securityConfigModeNames,
|
|
||||||
ServerSecurityConfig
|
ServerSecurityConfig
|
||||||
} from './lwm2m-profile-config.models';
|
} from './lwm2m-profile-config.models';
|
||||||
import { DeviceProfileService } from '@core/http/device-profile.service';
|
import { DeviceProfileService } from '@core/http/device-profile.service';
|
||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
import { mergeMap, takeUntil, tap } from 'rxjs/operators';
|
import { mergeMap, takeUntil, tap } from 'rxjs/operators';
|
||||||
import { Observable } from 'rxjs/internal/Observable';
|
import { Observable } from 'rxjs/internal/Observable';
|
||||||
|
import {
|
||||||
|
Lwm2mPublicKeyOrIdTooltipTranslationsMap,
|
||||||
|
Lwm2mSecurityType,
|
||||||
|
Lwm2mSecurityTypeTranslationMap
|
||||||
|
} from '@shared/models/lwm2m-security-config.models';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'tb-profile-lwm2m-device-config-server',
|
selector: 'tb-profile-lwm2m-device-config-server',
|
||||||
@ -56,15 +59,16 @@ import { Observable } from 'rxjs/internal/Observable';
|
|||||||
|
|
||||||
export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAccessor, Validator, OnDestroy {
|
export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAccessor, Validator, OnDestroy {
|
||||||
|
|
||||||
private disabled = false;
|
public disabled = false;
|
||||||
private destroy$ = new Subject();
|
private destroy$ = new Subject();
|
||||||
|
|
||||||
private isDataLoadedIntoCache = false;
|
private isDataLoadedIntoCache = false;
|
||||||
|
|
||||||
serverFormGroup: FormGroup;
|
serverFormGroup: FormGroup;
|
||||||
securityConfigLwM2MType = securityConfigMode;
|
securityConfigLwM2MType = Lwm2mSecurityType;
|
||||||
securityConfigLwM2MTypes = Object.keys(securityConfigMode);
|
securityConfigLwM2MTypes = Object.keys(Lwm2mSecurityType);
|
||||||
credentialTypeLwM2MNamesMap = securityConfigModeNames;
|
credentialTypeLwM2MNamesMap = Lwm2mSecurityTypeTranslationMap;
|
||||||
|
publicKeyOrIdTooltipNamesMap = Lwm2mPublicKeyOrIdTooltipTranslationsMap;
|
||||||
currentSecurityMode = null;
|
currentSecurityMode = null;
|
||||||
|
|
||||||
@Input()
|
@Input()
|
||||||
@ -81,7 +85,7 @@ export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAcc
|
|||||||
host: ['', Validators.required],
|
host: ['', Validators.required],
|
||||||
port: [this.isBootstrapServer ? DEFAULT_PORT_BOOTSTRAP_NO_SEC : DEFAULT_PORT_SERVER_NO_SEC,
|
port: [this.isBootstrapServer ? DEFAULT_PORT_BOOTSTRAP_NO_SEC : DEFAULT_PORT_SERVER_NO_SEC,
|
||||||
[Validators.required, Validators.min(1), Validators.max(65535), Validators.pattern('[0-9]*')]],
|
[Validators.required, Validators.min(1), Validators.max(65535), Validators.pattern('[0-9]*')]],
|
||||||
securityMode: [securityConfigMode.NO_SEC],
|
securityMode: [Lwm2mSecurityType.NO_SEC],
|
||||||
serverPublicKey: [''],
|
serverPublicKey: [''],
|
||||||
clientHoldOffTime: ['', [Validators.required, Validators.min(0), Validators.pattern('[0-9]*')]],
|
clientHoldOffTime: ['', [Validators.required, Validators.min(0), Validators.pattern('[0-9]*')]],
|
||||||
serverId: ['', [Validators.required, Validators.min(1), Validators.max(65534), Validators.pattern('[0-9]*')]],
|
serverId: ['', [Validators.required, Validators.min(1), Validators.max(65534), Validators.pattern('[0-9]*')]],
|
||||||
@ -136,16 +140,16 @@ export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAcc
|
|||||||
registerOnTouched(fn: any): void {
|
registerOnTouched(fn: any): void {
|
||||||
}
|
}
|
||||||
|
|
||||||
private updateValidate(securityMode: securityConfigMode): void {
|
private updateValidate(securityMode: Lwm2mSecurityType): void {
|
||||||
switch (securityMode) {
|
switch (securityMode) {
|
||||||
case securityConfigMode.NO_SEC:
|
case Lwm2mSecurityType.NO_SEC:
|
||||||
case securityConfigMode.PSK:
|
case Lwm2mSecurityType.PSK:
|
||||||
this.clearValidators();
|
this.clearValidators();
|
||||||
break;
|
break;
|
||||||
case securityConfigMode.RPK:
|
case Lwm2mSecurityType.RPK:
|
||||||
this.setValidators();
|
this.setValidators();
|
||||||
break;
|
break;
|
||||||
case securityConfigMode.X509:
|
case Lwm2mSecurityType.X509:
|
||||||
this.setValidators();
|
this.setValidators();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -166,7 +170,7 @@ export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAcc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private getLwm2mBootstrapSecurityInfo(securityMode = securityConfigMode.NO_SEC): Observable<ServerSecurityConfig> {
|
private getLwm2mBootstrapSecurityInfo(securityMode = Lwm2mSecurityType.NO_SEC): Observable<ServerSecurityConfig> {
|
||||||
return this.deviceProfileService.getLwm2mBootstrapSecurityInfoBySecurityType(this.isBootstrapServer, securityMode).pipe(
|
return this.deviceProfileService.getLwm2mBootstrapSecurityInfoBySecurityType(this.isBootstrapServer, securityMode).pipe(
|
||||||
tap(() => this.isDataLoadedIntoCache = true)
|
tap(() => this.isDataLoadedIntoCache = true)
|
||||||
);
|
);
|
||||||
|
|||||||
@ -31,24 +31,26 @@
|
|||||||
</section>
|
</section>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</mat-tab>
|
</mat-tab>
|
||||||
<mat-tab label="{{ 'device-profile.lwm2m.servers' | translate }}">
|
<mat-tab label="{{ 'device-profile.lwm2m.bootstrap-tab' | translate }}">
|
||||||
<section [formGroup]="lwm2mDeviceProfileFormGroup">
|
<section [formGroup]="lwm2mDeviceProfileFormGroup">
|
||||||
<section formGroupName="bootstrap" style="padding: 4px 2px">
|
<section formGroupName="bootstrap" style="padding: 20px 2px">
|
||||||
<mat-accordion multi="true">
|
<mat-accordion multi="true">
|
||||||
<mat-expansion-panel>
|
<mat-expansion-panel>
|
||||||
<mat-expansion-panel-header>
|
<mat-expansion-panel-header>
|
||||||
<mat-panel-title>{{ 'device-profile.lwm2m.servers' | translate }}</mat-panel-title>
|
<mat-panel-title>{{ 'device-profile.lwm2m.server' | translate }}</mat-panel-title>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<ng-template matExpansionPanelContent formGroupName="servers">
|
<ng-template matExpansionPanelContent formGroupName="servers">
|
||||||
<div fxLayout="row" fxLayout.xs="column" fxLayoutGap="8px" fxLayoutGap.xs="0px">
|
<div fxLayout="row" fxLayout.xs="column" fxLayoutGap="8px" fxLayoutGap.xs="0px">
|
||||||
<mat-form-field fxFlex>
|
<mat-form-field fxFlex>
|
||||||
<mat-label>{{ 'device-profile.lwm2m.short-id' | translate }}</mat-label>
|
<mat-label>{{ 'device-profile.lwm2m.short-id' | translate }}</mat-label>
|
||||||
|
<mat-icon *ngIf="!disabled" class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
|
matTooltip="{{'device-profile.lwm2m.short-id-tooltip' | translate }}">help</mat-icon>
|
||||||
<input matInput type="number" min="1" max="65534" formControlName="shortId" required>
|
<input matInput type="number" min="1" max="65534" formControlName="shortId" required>
|
||||||
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.shortId').hasError('required')">
|
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.shortId').hasError('required')">
|
||||||
{{ 'device-profile.lwm2m.short-id-required' | translate }}
|
{{ 'device-profile.lwm2m.short-id-required' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.shortId').hasError('min') ||
|
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.shortId').hasError('min') ||
|
||||||
lwm2mDeviceProfileFormGroup.get('bootstrap.servers.shortId').hasError('max')">
|
lwm2mDeviceProfileFormGroup.get('bootstrap.servers.shortId').hasError('max')">
|
||||||
{{ 'device-profile.lwm2m.short-id-range' | translate }}
|
{{ 'device-profile.lwm2m.short-id-range' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.shortId').hasError('pattern')">
|
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.shortId').hasError('pattern')">
|
||||||
@ -62,24 +64,28 @@
|
|||||||
{{ 'device-profile.lwm2m.lifetime-required' | translate }}
|
{{ 'device-profile.lwm2m.lifetime-required' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.lifetime').hasError('pattern') ||
|
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.lifetime').hasError('pattern') ||
|
||||||
lwm2mDeviceProfileFormGroup.get('bootstrap.servers.lifetime').hasError('min')">
|
lwm2mDeviceProfileFormGroup.get('bootstrap.servers.lifetime').hasError('min')">
|
||||||
{{ 'device-profile.lwm2m.lifetime-pattern' | translate }}
|
{{ 'device-profile.lwm2m.lifetime-pattern' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field fxFlex>
|
<mat-form-field fxFlex>
|
||||||
<mat-label>{{ 'device-profile.lwm2m.default-min-period' | translate }}</mat-label>
|
<mat-label>{{ 'device-profile.lwm2m.default-min-period' | translate }}</mat-label>
|
||||||
|
<mat-icon *ngIf="!disabled" class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
|
matTooltip="{{'device-profile.lwm2m.default-min-period-tooltip' | translate }}">help</mat-icon>
|
||||||
<input matInput type="number" min="0" formControlName="defaultMinPeriod" required>
|
<input matInput type="number" min="0" formControlName="defaultMinPeriod" required>
|
||||||
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.defaultMinPeriod').hasError('required')">
|
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.defaultMinPeriod').hasError('required')">
|
||||||
{{ 'device-profile.lwm2m.default-min-period-required' | translate }}
|
{{ 'device-profile.lwm2m.default-min-period-required' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.defaultMinPeriod').hasError('pattern') ||
|
<mat-error *ngIf="lwm2mDeviceProfileFormGroup.get('bootstrap.servers.defaultMinPeriod').hasError('pattern') ||
|
||||||
lwm2mDeviceProfileFormGroup.get('bootstrap.servers.defaultMinPeriod').hasError('min')">
|
lwm2mDeviceProfileFormGroup.get('bootstrap.servers.defaultMinPeriod').hasError('min')">
|
||||||
{{ 'device-profile.lwm2m.default-min-period-pattern' | translate }}
|
{{ 'device-profile.lwm2m.default-min-period-pattern' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<mat-form-field class="mat-block">
|
<mat-form-field class="mat-block">
|
||||||
<mat-label>{{ 'device-profile.lwm2m.binding' | translate }}</mat-label>
|
<mat-label>{{ 'device-profile.lwm2m.binding' | translate }}</mat-label>
|
||||||
|
<mat-icon *ngIf="!disabled" class="mat-primary" aria-hidden="false" aria-label="help-icon" matSuffix style="cursor:pointer;"
|
||||||
|
matTooltip="{{'device-profile.lwm2m.binding-tooltip' | translate }}">help</mat-icon>
|
||||||
<mat-select formControlName="binding">
|
<mat-select formControlName="binding">
|
||||||
<mat-option *ngFor="let bindingMode of bindingModeTypes" [value]="bindingMode">
|
<mat-option *ngFor="let bindingMode of bindingModeTypes" [value]="bindingMode">
|
||||||
{{ bindingModeTypeNamesMap.get(bindingMode) | translate }}
|
{{ bindingModeTypeNamesMap.get(bindingMode) | translate }}
|
||||||
|
|||||||
@ -79,8 +79,8 @@ import { takeUntil } from 'rxjs/operators';
|
|||||||
})
|
})
|
||||||
export class Lwm2mDeviceProfileTransportConfigurationComponent implements ControlValueAccessor, Validator, OnDestroy {
|
export class Lwm2mDeviceProfileTransportConfigurationComponent implements ControlValueAccessor, Validator, OnDestroy {
|
||||||
|
|
||||||
|
public disabled = false;
|
||||||
private requiredValue: boolean;
|
private requiredValue: boolean;
|
||||||
private disabled = false;
|
|
||||||
private destroy$ = new Subject();
|
private destroy$ = new Subject();
|
||||||
|
|
||||||
bindingModeTypes = Object.values(BingingMode);
|
bindingModeTypes = Object.values(BingingMode);
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
///
|
///
|
||||||
|
|
||||||
import { ValidatorFn, Validators } from '@angular/forms';
|
import { ValidatorFn, Validators } from '@angular/forms';
|
||||||
|
import { Lwm2mSecurityType } from '@shared/models/lwm2m-security-config.models';
|
||||||
|
|
||||||
export const PAGE_SIZE_LIMIT = 50;
|
export const PAGE_SIZE_LIMIT = 50;
|
||||||
export const INSTANCES = 'instances';
|
export const INSTANCES = 'instances';
|
||||||
@ -32,7 +33,7 @@ export const DEFAULT_CLIENT_HOLD_OFF_TIME = 1;
|
|||||||
export const DEFAULT_LIFE_TIME = 300;
|
export const DEFAULT_LIFE_TIME = 300;
|
||||||
export const DEFAULT_MIN_PERIOD = 1;
|
export const DEFAULT_MIN_PERIOD = 1;
|
||||||
export const DEFAULT_NOTIF_IF_DESIBLED = true;
|
export const DEFAULT_NOTIF_IF_DESIBLED = true;
|
||||||
export const DEFAULT_BINDING = 'UQ';
|
export const DEFAULT_BINDING = 'U';
|
||||||
export const DEFAULT_BOOTSTRAP_SERVER_ACCOUNT_TIME_OUT = 0;
|
export const DEFAULT_BOOTSTRAP_SERVER_ACCOUNT_TIME_OUT = 0;
|
||||||
export const INSTANCES_ID_VALUE_MIN = 0;
|
export const INSTANCES_ID_VALUE_MIN = 0;
|
||||||
export const INSTANCES_ID_VALUE_MAX = 65535;
|
export const INSTANCES_ID_VALUE_MAX = 65535;
|
||||||
@ -45,28 +46,30 @@ export const DEFAULT_PAGING_TRANSMISSION_WINDOW = 10000;
|
|||||||
|
|
||||||
export enum BingingMode {
|
export enum BingingMode {
|
||||||
U = 'U',
|
U = 'U',
|
||||||
UQ = 'UQ',
|
M = 'M',
|
||||||
|
H = 'H',
|
||||||
T = 'T',
|
T = 'T',
|
||||||
TQ = 'TQ',
|
|
||||||
S = 'S',
|
S = 'S',
|
||||||
SQ = 'SQ',
|
N = 'N',
|
||||||
US = 'US',
|
UQ = 'UQ',
|
||||||
TS = 'TS',
|
|
||||||
UQS = 'UQS',
|
UQS = 'UQS',
|
||||||
TQS = 'TQS'
|
TQ = 'TQ',
|
||||||
|
TQS = 'TQS',
|
||||||
|
SQ = 'SQ'
|
||||||
}
|
}
|
||||||
|
|
||||||
export const BingingModeTranslationsMap = new Map<BingingMode, string>(
|
export const BingingModeTranslationsMap = new Map<BingingMode, string>(
|
||||||
[
|
[
|
||||||
[BingingMode.U, 'device-profile.lwm2m.binding-type.u'],
|
[BingingMode.U, 'device-profile.lwm2m.binding-type.u'],
|
||||||
[BingingMode.UQ, 'device-profile.lwm2m.binding-type.uq'],
|
[BingingMode.M, 'device-profile.lwm2m.binding-type.m'],
|
||||||
[BingingMode.US, 'device-profile.lwm2m.binding-type.us'],
|
[BingingMode.H, 'device-profile.lwm2m.binding-type.h'],
|
||||||
[BingingMode.UQS, 'device-profile.lwm2m.binding-type.uqs'],
|
|
||||||
[BingingMode.T, 'device-profile.lwm2m.binding-type.t'],
|
[BingingMode.T, 'device-profile.lwm2m.binding-type.t'],
|
||||||
[BingingMode.TQ, 'device-profile.lwm2m.binding-type.tq'],
|
|
||||||
[BingingMode.TS, 'device-profile.lwm2m.binding-type.ts'],
|
|
||||||
[BingingMode.TQS, 'device-profile.lwm2m.binding-type.tqs'],
|
|
||||||
[BingingMode.S, 'device-profile.lwm2m.binding-type.s'],
|
[BingingMode.S, 'device-profile.lwm2m.binding-type.s'],
|
||||||
|
[BingingMode.N, 'device-profile.lwm2m.binding-type.n'],
|
||||||
|
[BingingMode.UQ, 'device-profile.lwm2m.binding-type.uq'],
|
||||||
|
[BingingMode.UQS, 'device-profile.lwm2m.binding-type.uqs'],
|
||||||
|
[BingingMode.TQ, 'device-profile.lwm2m.binding-type.tq'],
|
||||||
|
[BingingMode.TQS, 'device-profile.lwm2m.binding-type.tqs'],
|
||||||
[BingingMode.SQ, 'device-profile.lwm2m.binding-type.sq']
|
[BingingMode.SQ, 'device-profile.lwm2m.binding-type.sq']
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
@ -93,22 +96,6 @@ export const AttributeNameTranslationMap = new Map<AttributeName, string>(
|
|||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
export enum securityConfigMode {
|
|
||||||
PSK = 'PSK',
|
|
||||||
RPK = 'RPK',
|
|
||||||
X509 = 'X509',
|
|
||||||
NO_SEC = 'NO_SEC'
|
|
||||||
}
|
|
||||||
|
|
||||||
export const securityConfigModeNames = new Map<securityConfigMode, string>(
|
|
||||||
[
|
|
||||||
[securityConfigMode.PSK, 'Pre-Shared Key'],
|
|
||||||
[securityConfigMode.RPK, 'Raw Public Key'],
|
|
||||||
[securityConfigMode.X509, 'X.509 Certificate'],
|
|
||||||
[securityConfigMode.NO_SEC, 'No Security']
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
export enum PowerMode {
|
export enum PowerMode {
|
||||||
PSM = 'PSM',
|
PSM = 'PSM',
|
||||||
DRX = 'DRX',
|
DRX = 'DRX',
|
||||||
@ -134,7 +121,7 @@ export interface BootstrapServersSecurityConfig {
|
|||||||
export interface ServerSecurityConfig {
|
export interface ServerSecurityConfig {
|
||||||
host?: string;
|
host?: string;
|
||||||
port?: number;
|
port?: number;
|
||||||
securityMode: securityConfigMode;
|
securityMode: Lwm2mSecurityType;
|
||||||
serverPublicKey?: string;
|
serverPublicKey?: string;
|
||||||
clientHoldOffTime?: number;
|
clientHoldOffTime?: number;
|
||||||
serverId?: number;
|
serverId?: number;
|
||||||
@ -196,7 +183,7 @@ export function getDefaultBootstrapServerSecurityConfig(): ServerSecurityConfig
|
|||||||
clientHoldOffTime: DEFAULT_CLIENT_HOLD_OFF_TIME,
|
clientHoldOffTime: DEFAULT_CLIENT_HOLD_OFF_TIME,
|
||||||
host: DEFAULT_LOCAL_HOST_NAME,
|
host: DEFAULT_LOCAL_HOST_NAME,
|
||||||
port: DEFAULT_PORT_BOOTSTRAP_NO_SEC,
|
port: DEFAULT_PORT_BOOTSTRAP_NO_SEC,
|
||||||
securityMode: securityConfigMode.NO_SEC,
|
securityMode: Lwm2mSecurityType.NO_SEC,
|
||||||
serverId: DEFAULT_ID_BOOTSTRAP,
|
serverId: DEFAULT_ID_BOOTSTRAP,
|
||||||
serverPublicKey: ''
|
serverPublicKey: ''
|
||||||
};
|
};
|
||||||
|
|||||||
@ -30,6 +30,29 @@ export const Lwm2mSecurityTypeTranslationMap = new Map<Lwm2mSecurityType, string
|
|||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export const Lwm2mPublicKeyOrIdTooltipTranslationsMap = new Map<Lwm2mSecurityType, string>(
|
||||||
|
[
|
||||||
|
[Lwm2mSecurityType.PSK, 'device.lwm2m-security-config.client-publicKey-or-id-tooltip-psk'],
|
||||||
|
[Lwm2mSecurityType.RPK, 'device.lwm2m-security-config.client-publicKey-or-id-tooltip-rpk'],
|
||||||
|
[Lwm2mSecurityType.X509, 'device.lwm2m-security-config.client-publicKey-or-id-tooltip-x509']
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
export const Lwm2mClientSecretKeyTooltipTranslationsMap = new Map<Lwm2mSecurityType, string>(
|
||||||
|
[
|
||||||
|
[Lwm2mSecurityType.PSK, 'device.lwm2m-security-config.client-secret-key-tooltip-psk'],
|
||||||
|
[Lwm2mSecurityType.RPK, 'device.lwm2m-security-config.client-secret-key-tooltip-prk'],
|
||||||
|
[Lwm2mSecurityType.X509, 'device.lwm2m-security-config.client-secret-key-tooltip-x509']
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
export const Lwm2mClientKeyTooltipTranslationsMap = new Map<Lwm2mSecurityType, string>(
|
||||||
|
[
|
||||||
|
[Lwm2mSecurityType.PSK, 'device.lwm2m-security-config.client-secret-key-tooltip-psk'],
|
||||||
|
[Lwm2mSecurityType.RPK, 'device.lwm2m-security-config.client-secret-key-tooltip-prk']
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
export interface ClientSecurityConfig {
|
export interface ClientSecurityConfig {
|
||||||
securityConfigClientMode: Lwm2mSecurityType;
|
securityConfigClientMode: Lwm2mSecurityType;
|
||||||
endpoint: string;
|
endpoint: string;
|
||||||
|
|||||||
@ -1258,7 +1258,6 @@
|
|||||||
"view-attribute": "Zobrazit atribut",
|
"view-attribute": "Zobrazit atribut",
|
||||||
"remove-attribute": "Odebrat atribut",
|
"remove-attribute": "Odebrat atribut",
|
||||||
"mode": "Režim konfigurace bezpečnosti",
|
"mode": "Režim konfigurace bezpečnosti",
|
||||||
"servers": "Servery",
|
|
||||||
"short-id": "Krátké ID",
|
"short-id": "Krátké ID",
|
||||||
"short-id-required": "Krátké ID je povinné.",
|
"short-id-required": "Krátké ID je povinné.",
|
||||||
"short-id-range": "Krátké ID by mělo být v rozsahu od 1 do 65534.",
|
"short-id-range": "Krátké ID by mělo být v rozsahu od 1 do 65534.",
|
||||||
@ -1271,21 +1270,7 @@
|
|||||||
"default-min-period-pattern": "Minimální interval musí být kladné celé číslo.",
|
"default-min-period-pattern": "Minimální interval musí být kladné celé číslo.",
|
||||||
"notification-storing": "Ukládání notifikací v případě nedostupnosti",
|
"notification-storing": "Ukládání notifikací v případě nedostupnosti",
|
||||||
"binding": "Binding",
|
"binding": "Binding",
|
||||||
"binding-type": {
|
|
||||||
"u": "U: UDP spojení ve standardním režimu",
|
|
||||||
"uq": "UQ: UDP spojení v queue režimu",
|
|
||||||
"us": "US: UDP i SMS spojení aktivní, obojí ve standardním režimu",
|
|
||||||
"uqs": "UQS: UDP i SMS spojení aktivní; UDP v queue režimu, SMS ve standardním režimu",
|
|
||||||
"t": "T: TCP spojení ve standardním režimu",
|
|
||||||
"tq": "TQ: TCP spojení v queue režimu",
|
|
||||||
"ts": "TS: TCP i SMS spojení aktivní, obojí ve standardním režimu",
|
|
||||||
"tqs": "TQS: TCP i SMS spojení aktivní; TCP v queue režimu, SMS ve standardním režimu",
|
|
||||||
"s": "S: SMS spojení ve standardním režimu",
|
|
||||||
"sq": "SQ: SMS spojení v queue režimu"
|
|
||||||
},
|
|
||||||
"bootstrap-tab": "Bootstrap",
|
"bootstrap-tab": "Bootstrap",
|
||||||
"bootstrap-server": "Bootstrap server",
|
|
||||||
"lwm2m-server": "LwM2M server",
|
|
||||||
"server-host": "Host",
|
"server-host": "Host",
|
||||||
"server-host-required": "Host je povinný.",
|
"server-host-required": "Host je povinný.",
|
||||||
"server-port": "Port",
|
"server-port": "Port",
|
||||||
|
|||||||
@ -985,10 +985,16 @@
|
|||||||
"lwm2m-security-config": {
|
"lwm2m-security-config": {
|
||||||
"identity": "Client Identity",
|
"identity": "Client Identity",
|
||||||
"identity-required": "Client Identity is required.",
|
"identity-required": "Client Identity is required.",
|
||||||
|
"identity-tooltip": "The PSK identifier is an arbitrary PSK identifier up to 128 bytes, as described in the standard [RFC7925].\nThe PSK identifier MUST first be converted to a character string and then encoded into octets using UTF-8.",
|
||||||
"client-key": "Client Key",
|
"client-key": "Client Key",
|
||||||
"client-key-required": "Client Key is required.",
|
"client-key-required": "Client Key is required.",
|
||||||
|
"client-key-tooltip-prk": "RPK public key or id must be in the standard [RFC7250] and encoded to Base64 format!",
|
||||||
|
"client-key-tooltip-psk": "PSK key must be in the standard [RFC4279] and HexDec format: 32, 64, 128 characters!",
|
||||||
"endpoint": "Endpoint Client Name",
|
"endpoint": "Endpoint Client Name",
|
||||||
"endpoint-required": "Endpoint Client Name is required.",
|
"endpoint-required": "Endpoint Client Name is required.",
|
||||||
|
"client-public-key": "Client public key",
|
||||||
|
"client-public-key-hint": "If client public key is empty, the trusted certificate will be used",
|
||||||
|
"client-public-key-tooltip": "X509 public key must be in DER-encoded X509v3 format and support exclusively EC algorithm and then encoded to Base64 format!",
|
||||||
"mode": "Security config mode",
|
"mode": "Security config mode",
|
||||||
"client-tab": "Client Security Config",
|
"client-tab": "Client Security Config",
|
||||||
"client-certificate": "Client certificate",
|
"client-certificate": "Client certificate",
|
||||||
@ -997,10 +1003,14 @@
|
|||||||
"lwm2m-server": "LwM2M Server",
|
"lwm2m-server": "LwM2M Server",
|
||||||
"client-publicKey-or-id": "Client Public Key or Id",
|
"client-publicKey-or-id": "Client Public Key or Id",
|
||||||
"client-publicKey-or-id-required": "Client Public Key or Id is required.",
|
"client-publicKey-or-id-required": "Client Public Key or Id is required.",
|
||||||
|
"client-publicKey-or-id-tooltip-psk": "The PSK identifier is an arbitrary PSK identifier up to 128 bytes, as described in the standard [RFC7925].\nThe PSK identifier MUST first be converted to a character string and then encoded into octets using UTF-8.",
|
||||||
|
"client-publicKey-or-id-tooltip-rpk": "RPK public key or id must be in the standard [RFC7250] and encoded to Base64 format!",
|
||||||
|
"client-publicKey-or-id-tooltip-x509": "X509 public key must be in DER-encoded X509v3 format and support exclusively EC algorithm and then encoded to Base64 format",
|
||||||
"client-secret-key": "Client Secret Key",
|
"client-secret-key": "Client Secret Key",
|
||||||
"client-secret-key-required": "Client Secret Key is required.",
|
"client-secret-key-required": "Client Secret Key is required.",
|
||||||
"client-public-key": "Client public key",
|
"client-secret-key-tooltip-psk": "PSK key must be in the standard [RFC4279] and HexDec format: 32, 64, 128 characters!",
|
||||||
"client-public-key-hint": "If client public key is empty, the trusted certificate will be used"
|
"client-secret-key-tooltip-prk": "RPK secret key must be in PKCS_8 format (DER encoding, standard [RFC5958]) and then encoded to Base64 format!",
|
||||||
|
"client-secret-key-tooltip-x509": "X509 secret key must be in PKCS_8 format (DER encoding, standard [RFC5958]) and then encoded to Base64 format!"
|
||||||
},
|
},
|
||||||
"client-id": "Client ID",
|
"client-id": "Client ID",
|
||||||
"client-id-pattern": "Contains invalid character.",
|
"client-id-pattern": "Contains invalid character.",
|
||||||
@ -1301,32 +1311,38 @@
|
|||||||
"view-attribute": "View attribute",
|
"view-attribute": "View attribute",
|
||||||
"remove-attribute": "Remove attribute",
|
"remove-attribute": "Remove attribute",
|
||||||
"mode": "Security config mode",
|
"mode": "Security config mode",
|
||||||
"servers": "Servers",
|
"bootstrap-tab": "Bootstrap",
|
||||||
|
"bootstrap-server-legend": "Bootstrap Server (ShortId...)",
|
||||||
|
"lwm2m-server-legend": "LwM2M Server (ShortId...)",
|
||||||
|
"server": "Server",
|
||||||
"short-id": "Short ID",
|
"short-id": "Short ID",
|
||||||
|
"short-id-tooltip": "Server ShortID must be equal Security ShortID ",
|
||||||
"short-id-required": "Short ID is required.",
|
"short-id-required": "Short ID is required.",
|
||||||
"short-id-range": "Short ID should be in a range from 1 to 65534.",
|
"short-id-range": "Short ID should be in a range from 1 to 65534.",
|
||||||
"short-id-pattern": "Short ID must be a positive integer.",
|
"short-id-pattern": "Short ID must be a positive integer.",
|
||||||
"lifetime": "Client registration lifetime",
|
"lifetime": "Client registration lifetime",
|
||||||
"lifetime-required": "Client registration lifetime is required.",
|
"lifetime-required": "Client registration lifetime is required.",
|
||||||
"lifetime-pattern": "Client registration lifetime must be a positive integer.",
|
"lifetime-pattern": "Client registration lifetime must be a positive integer.",
|
||||||
"default-min-period": "Minimum period between two notifications (s)",
|
"default-min-period": "Min period between two notifications (s)",
|
||||||
|
"default-min-period-tooltip": "The default value the LwM2M Client should use for the Minimum Period of an Observation in the absence of this parameter being included in an Observation.",
|
||||||
"default-min-period-required": "Minimum period is required.",
|
"default-min-period-required": "Minimum period is required.",
|
||||||
"default-min-period-pattern": "Minimum period must be a positive integer.",
|
"default-min-period-pattern": "Minimum period must be a positive integer.",
|
||||||
"notification-storing": "Notification storing when disabled or offline",
|
"notification-storing": "Notification storing when disabled or offline",
|
||||||
"binding": "Binding",
|
"binding": "Binding",
|
||||||
"binding-type": {
|
"binding-type": {
|
||||||
"u": "U: UDP connection in standard mode",
|
"u": "U: Client is reachable via the UDP binding at any time.",
|
||||||
"uq": "UQ: UDP connection in queue mode",
|
"m": "M: Client is reachable via the MQTT binding at any time.",
|
||||||
"us": "US: both UDP and SMS connections active, both in standard mode",
|
"h": "H: Client is reachable via the HTTP binding at any time.",
|
||||||
"uqs": "UQS: both UDP and SMS connections active; UDP in queue mode, SMS in standard mode",
|
"t": "T: Client is reachable via the TCP binding at any time.",
|
||||||
"t": "T: TCP connection in standard mode",
|
"s": "S: Client is reachable via the SMS binding at any time.",
|
||||||
"tq": "TQ: TCP connection in queue mode",
|
"n": "N: Client MUST send the response to such a request over the Non-IP binding (is supported since LWM2M 1.1).",
|
||||||
"ts": "TS: both TCP and SMS connections active, both in standard mode",
|
"uq": "UQ: UDP connection in queue mode (is not supported since LWM2M 1.1)",
|
||||||
"tqs": "TQS: both TCP and SMS connections active; TCP in queue mode, SMS in standard mode",
|
"uqs": "UQS: both UDP and SMS connections active; UDP in queue mode, SMS in standard mode (is not supported since LWM2M 1.1)",
|
||||||
"s": "S: SMS connection in standard mode",
|
"tq": "TQ: TCP connection in queue mode (is not supported since LWM2M 1.1)",
|
||||||
"sq": "SQ: SMS connection in queue mode"
|
"tqs": "TQS: both TCP and SMS connections active; TCP in queue mode, SMS in standard mode (is not supported since LWM2M 1.1)",
|
||||||
|
"sq": "SQ: SMS connection in queue mode (is not supported since LWM2M 1.1)"
|
||||||
},
|
},
|
||||||
"bootstrap-tab": "Bootstrap",
|
"binding-tooltip": "Tis is the list in the\"binding\" resource of the LwM2M server object - /1/x/7.\nIndicates the supported binding modes in the LwM2M Client.\nThis value SHOULD be the same as the value in the “Supported Binding and Modes” resource in the Device Object (/3/0/16).\nWhile multiple transports are supported, only one transport binding can be used during the entire Transport Session.\nAs an example, when UDP and SMS are both supported, the LwM2M Client and the LwM2M Server can choose to communicate either over UDP or SMS during the entire Transport Session.",
|
||||||
"bootstrap-server": "Bootstrap Server",
|
"bootstrap-server": "Bootstrap Server",
|
||||||
"lwm2m-server": "LwM2M Server",
|
"lwm2m-server": "LwM2M Server",
|
||||||
"server-host": "Host",
|
"server-host": "Host",
|
||||||
|
|||||||
@ -1271,7 +1271,6 @@
|
|||||||
"view-attribute": "Öznitelik görüntüle",
|
"view-attribute": "Öznitelik görüntüle",
|
||||||
"remove-attribute": "Öznitelik kaldır",
|
"remove-attribute": "Öznitelik kaldır",
|
||||||
"mode": "Güvenlik yapılandırma modu",
|
"mode": "Güvenlik yapılandırma modu",
|
||||||
"servers": "Sunucular",
|
|
||||||
"short-id": "Kısa ID",
|
"short-id": "Kısa ID",
|
||||||
"short-id-required": "Kısa ID gerekli.",
|
"short-id-required": "Kısa ID gerekli.",
|
||||||
"short-id-range": "Kısa ID 1 ile 65534 aralığında olmalıdır.",
|
"short-id-range": "Kısa ID 1 ile 65534 aralığında olmalıdır.",
|
||||||
@ -1284,18 +1283,6 @@
|
|||||||
"default-min-period-pattern": "Minimum süre pozitif bir tam sayı olmalıdır.",
|
"default-min-period-pattern": "Minimum süre pozitif bir tam sayı olmalıdır.",
|
||||||
"notification-storing": "Devre dışı bırakıldığında veya çevrimdışı olduğunda bildirim depolama",
|
"notification-storing": "Devre dışı bırakıldığında veya çevrimdışı olduğunda bildirim depolama",
|
||||||
"binding": "Bağlama",
|
"binding": "Bağlama",
|
||||||
"binding-type": {
|
|
||||||
"u": "U: UDP connection in standard mode",
|
|
||||||
"uq": "UQ: UDP connection in queue mode",
|
|
||||||
"us": "US: both UDP and SMS connections active, both in standard mode",
|
|
||||||
"uqs": "UQS: both UDP and SMS connections active; UDP in queue mode, SMS in standard mode",
|
|
||||||
"t": "T: TCP connection in standard mode",
|
|
||||||
"tq": "TQ: TCP connection in queue mode",
|
|
||||||
"ts": "TS: both TCP and SMS connections active, both in standard mode",
|
|
||||||
"tqs": "TQS: both TCP and SMS connections active; TCP in queue mode, SMS in standard mode",
|
|
||||||
"s": "S: SMS connection in standard mode",
|
|
||||||
"sq": "SQ: SMS connection in queue mode"
|
|
||||||
},
|
|
||||||
"bootstrap-tab": "Bootstrap",
|
"bootstrap-tab": "Bootstrap",
|
||||||
"bootstrap-server": "Bootstrap Sunucusu",
|
"bootstrap-server": "Bootstrap Sunucusu",
|
||||||
"lwm2m-server": "LwM2M Sunucusu",
|
"lwm2m-server": "LwM2M Sunucusu",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user