From c7283deeab9ea552eabb0c41c40e3477ac7377a0 Mon Sep 17 00:00:00 2001 From: Bohdan Khablenko Date: Wed, 6 Apr 2016 16:42:52 +0300 Subject: [PATCH] KAA-876: Device management * KAA-876: Trustful credentials service implementation * KAA-876: Fix the Admin UI --- .../failover/DefaultFailoverManager.java | 1 + .../kaa/server/common/dao/DaoConstants.java | 1 + .../common/dao/model/sql/Application.java | 37 +++++++--- ...l.java => InternalCredentialsService.java} | 4 +- .../service/TrustfulCredentialsService.java | 68 +++++++++++++++++++ .../src/main/resources/common-dao-context.xml | 6 +- .../kaa/common/dto/ApplicationDto.java | 11 ++- .../dto/credentials/CredentialsDto.java | 10 ++- .../mongo/dao/CredentialsMongoDaoTest.java | 1 + .../test/resources/mongo-dao-test-context.xml | 2 +- .../mvp/activity/ApplicationActivity.java | 25 +++++++ .../admin/client/mvp/data/DataSource.java | 8 +++ .../client/mvp/view/ApplicationView.java | 3 + .../view/application/ApplicationViewImpl.java | 31 ++++++++- .../admin/services/KaaAdminServiceImpl.java | 10 +++ .../shared/services/KaaAdminService.java | 2 + .../control/service/ControlService.java | 9 +++ .../service/DefaultControlService.java | 5 ++ .../CredentialsServiceLocator.java | 16 +++++ .../DefaultCredentialsServiceLocator.java | 34 ++++++++-- .../src/main/resources/kaaNodeContext.xml | 4 +- .../client/i18n/KaaAdminConstants.properties | 2 + .../operations/common-test-context.xml | 4 +- 23 files changed, 264 insertions(+), 30 deletions(-) rename server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/{CredentialsServiceImpl.java => InternalCredentialsService.java} (96%) create mode 100644 server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/TrustfulCredentialsService.java diff --git a/client/client-multi/client-java-core/src/main/java/org/kaaproject/kaa/client/channel/failover/DefaultFailoverManager.java b/client/client-multi/client-java-core/src/main/java/org/kaaproject/kaa/client/channel/failover/DefaultFailoverManager.java index 99dffb9b2b..3eb7020f77 100644 --- a/client/client-multi/client-java-core/src/main/java/org/kaaproject/kaa/client/channel/failover/DefaultFailoverManager.java +++ b/client/client-multi/client-java-core/src/main/java/org/kaaproject/kaa/client/channel/failover/DefaultFailoverManager.java @@ -19,6 +19,7 @@ import org.kaaproject.kaa.client.channel.KaaChannelManager; import org.kaaproject.kaa.client.channel.ServerType; import org.kaaproject.kaa.client.channel.TransportConnectionInfo; +import org.kaaproject.kaa.client.channel.failover.FailoverDecision.FailoverAction; import org.kaaproject.kaa.client.channel.failover.strategies.DefaultFailoverStrategy; import org.kaaproject.kaa.client.channel.failover.strategies.FailoverStrategy; import org.kaaproject.kaa.client.context.ExecutorContext; diff --git a/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/DaoConstants.java b/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/DaoConstants.java index 684a9ce19f..5ee580b8da 100644 --- a/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/DaoConstants.java +++ b/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/DaoConstants.java @@ -107,6 +107,7 @@ public class DaoConstants { public static final String APPLICATION_NAME = NAME; public static final String APPLICATION_SEQUENCE_NUMBER = SEQUENCE_NUMBER; public static final String APPLICATION_TENANT_ID = TENANT_ID; + public static final String APPLICATION_CREDENTIALS_SERVICE_NAME = "credentials_service"; /** * User constants. diff --git a/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/model/sql/Application.java b/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/model/sql/Application.java index d159260808..8c5312f00e 100644 --- a/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/model/sql/Application.java +++ b/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/model/sql/Application.java @@ -16,9 +16,15 @@ package org.kaaproject.kaa.server.common.dao.model.sql; -import org.hibernate.annotations.OnDelete; -import org.hibernate.annotations.OnDeleteAction; -import org.kaaproject.kaa.common.dto.ApplicationDto; +import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_APPLICATION_TOKEN; +import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_CREDENTIALS_SERVICE_NAME; +import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_NAME; +import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_SEQUENCE_NUMBER; +import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_TABLE_NAME; +import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_TENANT_ID; +import static org.kaaproject.kaa.server.common.dao.model.sql.ModelUtils.getLongId; + +import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; @@ -26,14 +32,10 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.UniqueConstraint; -import java.io.Serializable; -import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_APPLICATION_TOKEN; -import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_NAME; -import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_SEQUENCE_NUMBER; -import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_TABLE_NAME; -import static org.kaaproject.kaa.server.common.dao.DaoConstants.APPLICATION_TENANT_ID; -import static org.kaaproject.kaa.server.common.dao.model.sql.ModelUtils.getLongId; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import org.kaaproject.kaa.common.dto.ApplicationDto; @Entity @Table(name = APPLICATION_TABLE_NAME, uniqueConstraints = { @@ -56,6 +58,9 @@ public class Application extends GenericModel implements Seriali @OnDelete(action = OnDeleteAction.CASCADE) private Tenant tenant; + @Column(name = APPLICATION_CREDENTIALS_SERVICE_NAME) + private String credentialsServiceName; + public Application() { } @@ -73,6 +78,7 @@ public Application(ApplicationDto dto) { if (tenantId != null) { this.tenant = new Tenant(tenantId); } + this.credentialsServiceName = dto.getCredentialsServiceName(); } } @@ -108,6 +114,14 @@ public void setTenant(Tenant tenant) { this.tenant = tenant; } + public String getCredentialsServiceName() { + return credentialsServiceName; + } + + public void setCredentialsServiceName(String credentialsServiceName) { + this.credentialsServiceName = credentialsServiceName; + } + public int incrementSequenceNumber() { return ++sequenceNumber; } @@ -115,7 +129,7 @@ public int incrementSequenceNumber() { @Override public String toString() { return "Application [id=" + id + ", applicationToken=" + applicationToken + ", name=" + name + ", sequenceNumber=" + sequenceNumber - + ", tenant=" + tenant + "]"; + + ", tenant=" + tenant + ", credentialsServiceName=" + credentialsServiceName + "]"; } @Override @@ -196,6 +210,7 @@ public ApplicationDto toDto() { if (tenant != null) { dto.setTenantId(tenant.getStringId()); } + dto.setCredentialsServiceName(credentialsServiceName); return dto; } } diff --git a/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/CredentialsServiceImpl.java b/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/InternalCredentialsService.java similarity index 96% rename from server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/CredentialsServiceImpl.java rename to server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/InternalCredentialsService.java index 7426cff2a8..c5751ef956 100644 --- a/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/CredentialsServiceImpl.java +++ b/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/InternalCredentialsService.java @@ -40,9 +40,9 @@ */ @Service @Transactional -public class CredentialsServiceImpl implements CredentialsService { +public class InternalCredentialsService implements CredentialsService { - private static final Logger LOG = LoggerFactory.getLogger(EndpointRegistrationServiceImpl.class); + private static final Logger LOG = LoggerFactory.getLogger(InternalCredentialsService.class); private CredentialsDao credentialsDao; diff --git a/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/TrustfulCredentialsService.java b/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/TrustfulCredentialsService.java new file mode 100644 index 0000000000..e69d351a12 --- /dev/null +++ b/server/common/dao/src/main/java/org/kaaproject/kaa/server/common/dao/service/TrustfulCredentialsService.java @@ -0,0 +1,68 @@ +/** + * Copyright 2014-2016 CyberVision, Inc. + * + * 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.kaaproject.kaa.server.common.dao.service; + +import java.util.Optional; + +import org.kaaproject.kaa.common.dto.credentials.CredentialsDto; +import org.kaaproject.kaa.common.dto.credentials.CredentialsStatus; +import org.kaaproject.kaa.server.common.dao.CredentialsService; +import org.kaaproject.kaa.server.common.dao.exception.CredentialsServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * A dummy credentials service to be used in case of no credentials validation + * is needed. + * + * @author Bohdan Khablenko + * + * @since v0.9.0 + */ +@Service +public class TrustfulCredentialsService implements CredentialsService { + + private static final Logger LOG = LoggerFactory.getLogger(TrustfulCredentialsService.class); + + @Override + public CredentialsDto provideCredentials(String applicationId, CredentialsDto credentials) throws CredentialsServiceException { + LOG.debug("Returning credentials provided [{}]", credentials); + return credentials; + } + + @Override + public Optional lookupCredentials(String applicationId, String credentialsId) throws CredentialsServiceException { + CredentialsDto credentials = new CredentialsDto(credentialsId, null, CredentialsStatus.AVAILABLE); + LOG.debug("Returning dummy credentials [{}]", credentials); + return Optional.of(credentials); + } + + @Override + public void markCredentialsInUse(String applicationId, String credentialsId) throws CredentialsServiceException { + this.updateStatus(applicationId, credentialsId, CredentialsStatus.IN_USE); + } + + @Override + public void markCredentialsRevoked(String applicationId, String credentialsId) throws CredentialsServiceException { + this.updateStatus(applicationId, credentialsId, CredentialsStatus.REVOKED); + } + + private void updateStatus(String applicationId, String credentialsId, CredentialsStatus status) { + LOG.debug("Consider credentials [{}] for application [{}] to be [{}]", credentialsId, applicationId, status); + } +} diff --git a/server/common/dao/src/main/resources/common-dao-context.xml b/server/common/dao/src/main/resources/common-dao-context.xml index 03abb6fc4f..f1e0e8f3ce 100644 --- a/server/common/dao/src/main/resources/common-dao-context.xml +++ b/server/common/dao/src/main/resources/common-dao-context.xml @@ -90,8 +90,12 @@ - + + + + + diff --git a/server/common/dto/src/main/java/org/kaaproject/kaa/common/dto/ApplicationDto.java b/server/common/dto/src/main/java/org/kaaproject/kaa/common/dto/ApplicationDto.java index 94a61a7183..2a1bcc3cb4 100644 --- a/server/common/dto/src/main/java/org/kaaproject/kaa/common/dto/ApplicationDto.java +++ b/server/common/dto/src/main/java/org/kaaproject/kaa/common/dto/ApplicationDto.java @@ -27,6 +27,7 @@ public class ApplicationDto implements HasId, Serializable { private String name; private int sequenceNumber; private String tenantId; + private String credentialsServiceName; @Override public String getId() { @@ -70,6 +71,14 @@ public void setTenantId(String tenantId) { this.tenantId = tenantId; } + public String getCredentialsServiceName() { + return this.credentialsServiceName; + } + + public void setCredentialsServiceName(String credentialsServiceName) { + this.credentialsServiceName = credentialsServiceName; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -109,6 +118,6 @@ public int hashCode() { @Override public String toString() { return "ApplicationDto{" + "id='" + id + '\'' + ", applicationToken='" + applicationToken + '\'' + ", name='" + name + '\'' - + ", sequenceNumber=" + sequenceNumber + ", tenantId='" + tenantId + '\'' + '}'; + + ", sequenceNumber=" + sequenceNumber + ", tenantId='" + tenantId + ", credentialsServiceName='" + credentialsServiceName + '\'' + '}'; } } diff --git a/server/common/dto/src/main/java/org/kaaproject/kaa/common/dto/credentials/CredentialsDto.java b/server/common/dto/src/main/java/org/kaaproject/kaa/common/dto/credentials/CredentialsDto.java index 6518be40cc..2fd946faf3 100644 --- a/server/common/dto/src/main/java/org/kaaproject/kaa/common/dto/credentials/CredentialsDto.java +++ b/server/common/dto/src/main/java/org/kaaproject/kaa/common/dto/credentials/CredentialsDto.java @@ -37,13 +37,19 @@ public class CredentialsDto implements HasId, Serializable { private String id; private byte[] credentialsBody; - private CredentialsStatus status = CredentialsStatus.AVAILABLE; + private CredentialsStatus status; public CredentialsDto() { + this(null, CredentialsStatus.AVAILABLE); } public CredentialsDto(byte[] credentialsBody, CredentialsStatus status) { - this.credentialsBody = Arrays.copyOf(credentialsBody, credentialsBody.length); + this(null, credentialsBody, status); + } + + public CredentialsDto(String credentialsId, byte[] credentialsBody, CredentialsStatus status) { + this.id = credentialsId; + this.credentialsBody = credentialsBody != null ? Arrays.copyOf(credentialsBody, credentialsBody.length) : null; this.status = status; } diff --git a/server/common/nosql/mongo-dao/src/test/java/org/kaaproject/kaa/server/common/nosql/mongo/dao/CredentialsMongoDaoTest.java b/server/common/nosql/mongo-dao/src/test/java/org/kaaproject/kaa/server/common/nosql/mongo/dao/CredentialsMongoDaoTest.java index 38a71fcecd..df8a3adb9e 100644 --- a/server/common/nosql/mongo-dao/src/test/java/org/kaaproject/kaa/server/common/nosql/mongo/dao/CredentialsMongoDaoTest.java +++ b/server/common/nosql/mongo-dao/src/test/java/org/kaaproject/kaa/server/common/nosql/mongo/dao/CredentialsMongoDaoTest.java @@ -38,6 +38,7 @@ @ContextConfiguration(locations = "/mongo-dao-test-context.xml") @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) public class CredentialsMongoDaoTest extends AbstractMongoTest { + private static final byte[] CREDENTIALS_BODY = "credentials_body".getBytes(); private static final String APPLICATION_ID = "application_id"; diff --git a/server/common/nosql/mongo-dao/src/test/resources/mongo-dao-test-context.xml b/server/common/nosql/mongo-dao/src/test/resources/mongo-dao-test-context.xml index fd960e72e2..aa62a04c86 100644 --- a/server/common/nosql/mongo-dao/src/test/resources/mongo-dao-test-context.xml +++ b/server/common/nosql/mongo-dao/src/test/resources/mongo-dao-test-context.xml @@ -84,7 +84,7 @@ - + diff --git a/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/activity/ApplicationActivity.java b/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/activity/ApplicationActivity.java index 7dc368a99c..3d2d43a5ee 100644 --- a/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/activity/ApplicationActivity.java +++ b/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/activity/ApplicationActivity.java @@ -16,17 +16,21 @@ package org.kaaproject.kaa.server.admin.client.mvp.activity; +import java.util.List; + import org.kaaproject.kaa.common.dto.ApplicationDto; import org.kaaproject.kaa.server.admin.client.KaaAdmin; import org.kaaproject.kaa.server.admin.client.mvp.ClientFactory; import org.kaaproject.kaa.server.admin.client.mvp.place.ApplicationPlace; import org.kaaproject.kaa.server.admin.client.mvp.place.SdkProfilesPlace; import org.kaaproject.kaa.server.admin.client.mvp.view.ApplicationView; +import org.kaaproject.kaa.server.admin.client.util.Utils; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.shared.EventBus; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.ValueListBox; public class ApplicationActivity extends @@ -77,11 +81,32 @@ protected void onEntityRetrieved() { } detailsView.getApplicationName().setValue(entity.getName()); + ValueListBox serviceNames = this.detailsView.getCredentialsServiceName(); + if (serviceNames != null) { + KaaAdmin.getDataSource().getCredentialsServiceNames(new AsyncCallback>() { + + @Override + public void onFailure(Throwable caught) { + Utils.handleException(caught, ApplicationActivity.this.detailsView); + } + + @Override + public void onSuccess(List result) { + ApplicationActivity.this.detailsView.getCredentialsServiceName().setAcceptableValues(result); + } + }); + String serviceName = this.entity.getCredentialsServiceName(); + if (!"".equals(serviceName) && serviceName != null) { + serviceNames.setValue(serviceName); + serviceNames.setEnabled(false); + } + } } @Override protected void onSave() { entity.setName(detailsView.getApplicationName().getValue()); + entity.setCredentialsServiceName(detailsView.getCredentialsServiceName().getValue()); } @Override diff --git a/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/data/DataSource.java b/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/data/DataSource.java index 2614a15907..6776432261 100644 --- a/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/data/DataSource.java +++ b/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/data/DataSource.java @@ -1524,4 +1524,12 @@ protected void onResult(List result) { } }); } + + public void getCredentialsServiceNames(final AsyncCallback> callback) { + rpcService.getCredentialsServiceNames(new DataCallback>(callback) { + @Override + protected void onResult(List result) { + } + }); + } } diff --git a/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/view/ApplicationView.java b/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/view/ApplicationView.java index 6ee90f8d0f..6d1b6c3fc8 100644 --- a/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/view/ApplicationView.java +++ b/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/view/ApplicationView.java @@ -18,6 +18,7 @@ import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.user.client.ui.HasValue; +import com.google.gwt.user.client.ui.ValueListBox; public interface ApplicationView extends BaseDetailsView { @@ -27,6 +28,8 @@ public interface ApplicationView extends BaseDetailsView { HasValue getApplicationToken(); + ValueListBox getCredentialsServiceName(); + HasClickHandlers getGenerateSdkButton(); } diff --git a/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/view/application/ApplicationViewImpl.java b/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/view/application/ApplicationViewImpl.java index 1f66e0ea34..f3b8414a44 100644 --- a/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/view/application/ApplicationViewImpl.java +++ b/server/node/src/main/java/org/kaaproject/kaa/server/admin/client/mvp/view/application/ApplicationViewImpl.java @@ -24,15 +24,20 @@ import org.kaaproject.kaa.server.admin.client.util.Utils; import com.google.gwt.event.dom.client.HasClickHandlers; +import com.google.gwt.event.logical.shared.ValueChangeEvent; +import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HasValue; import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.ValueListBox; public class ApplicationViewImpl extends BaseDetailsViewImpl implements ApplicationView { private SizedTextBox applicationName; private SizedTextBox applicationToken; + private ValueListBox credentialsServiceName; + private Button generateSdkButton; public ApplicationViewImpl(boolean create, boolean editable) { @@ -90,17 +95,36 @@ protected void initDetailsTable() { if (KaaAdmin.isDevMode()) { generateSdkButton = new Button(Utils.constants.generateSdk()); detailsTable.setWidget(3, 0, generateSdkButton); + } else { + this.credentialsServiceName = new ValueListBox(); + this.credentialsServiceName.addValueChangeHandler(new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + ApplicationViewImpl.this.fireChanged(); + } + }); + this.credentialsServiceName.setWidth("100%"); + + Label label = new Label(Utils.constants.credentialsService()); + label.addStyleName(this.avroUiStyle.requiredField()); + + this.detailsTable.setWidget(3, 0, label); + this.detailsTable.setWidget(3, 1, this.credentialsServiceName); } } @Override protected void resetImpl() { applicationName.setValue(""); + + if (this.credentialsServiceName != null) { + this.credentialsServiceName.setValue(""); + } } @Override protected boolean validate() { - return applicationName.getValue().length()>0; + return applicationName.getValue().length()>0 && credentialsServiceName.getValue().length() > 0; } @Override @@ -108,6 +132,11 @@ public HasValue getApplicationName() { return applicationName; } + @Override + public ValueListBox getCredentialsServiceName() { + return this.credentialsServiceName; + } + @Override public HasClickHandlers getGenerateSdkButton() { return generateSdkButton; diff --git a/server/node/src/main/java/org/kaaproject/kaa/server/admin/services/KaaAdminServiceImpl.java b/server/node/src/main/java/org/kaaproject/kaa/server/admin/services/KaaAdminServiceImpl.java index 78b5c50f23..a43880247f 100644 --- a/server/node/src/main/java/org/kaaproject/kaa/server/admin/services/KaaAdminServiceImpl.java +++ b/server/node/src/main/java/org/kaaproject/kaa/server/admin/services/KaaAdminServiceImpl.java @@ -3667,4 +3667,14 @@ public void provideRegistration( throw Utils.handleException(cause); } } + + @Override + public List getCredentialsServiceNames() throws KaaAdminServiceException { + this.checkAuthority(KaaAuthorityDto.values()); + try { + return this.controlService.getCredentialsServiceNames(); + } catch (Exception cause) { + throw Utils.handleException(cause); + } + } } diff --git a/server/node/src/main/java/org/kaaproject/kaa/server/admin/shared/services/KaaAdminService.java b/server/node/src/main/java/org/kaaproject/kaa/server/admin/shared/services/KaaAdminService.java index 4f9e8c61e4..b61bc2a1d1 100644 --- a/server/node/src/main/java/org/kaaproject/kaa/server/admin/shared/services/KaaAdminService.java +++ b/server/node/src/main/java/org/kaaproject/kaa/server/admin/shared/services/KaaAdminService.java @@ -431,4 +431,6 @@ CtlSchemaFormDto createNewCTLSchemaFormInstance(String metaInfoId, void provideRegistration(String applicationId, String credentialsId, Integer serverProfileVersion, String serverProfileBody) throws KaaAdminServiceException; void onCredentialsRevoked(String applicationId, String credentialsId) throws KaaAdminServiceException; + + List getCredentialsServiceNames() throws KaaAdminServiceException; } diff --git a/server/node/src/main/java/org/kaaproject/kaa/server/control/service/ControlService.java b/server/node/src/main/java/org/kaaproject/kaa/server/control/service/ControlService.java index b4e3340ae1..4b3db131ae 100644 --- a/server/node/src/main/java/org/kaaproject/kaa/server/control/service/ControlService.java +++ b/server/node/src/main/java/org/kaaproject/kaa/server/control/service/ControlService.java @@ -1753,4 +1753,13 @@ ApplicationEventFamilyMapDto editApplicationEventFamilyMap(ApplicationEventFamil * @throws ControlServiceException - if an exception occures. */ void provideRegistration(String applicationId, String credentialsId, Integer serverProfileVersion, String serverProfileBody) throws ControlServiceException; + + /** + * Returns the names of credentials services configured. + * + * @return The names of credentials services configured + * + * @throws ControlServiceException - if an exception occures. + */ + List getCredentialsServiceNames() throws ControlServiceException; } diff --git a/server/node/src/main/java/org/kaaproject/kaa/server/control/service/DefaultControlService.java b/server/node/src/main/java/org/kaaproject/kaa/server/control/service/DefaultControlService.java index 146e9f9aa6..303a7b44c0 100644 --- a/server/node/src/main/java/org/kaaproject/kaa/server/control/service/DefaultControlService.java +++ b/server/node/src/main/java/org/kaaproject/kaa/server/control/service/DefaultControlService.java @@ -2316,4 +2316,9 @@ public void provideRegistration( throw new ControlServiceException(cause); } } + + @Override + public List getCredentialsServiceNames() throws ControlServiceException { + return this.credentialsServiceLocator.getCredentialsServiceNames(); + } } diff --git a/server/node/src/main/java/org/kaaproject/kaa/server/node/service/credentials/CredentialsServiceLocator.java b/server/node/src/main/java/org/kaaproject/kaa/server/node/service/credentials/CredentialsServiceLocator.java index 8c5163223a..78e8d1d139 100644 --- a/server/node/src/main/java/org/kaaproject/kaa/server/node/service/credentials/CredentialsServiceLocator.java +++ b/server/node/src/main/java/org/kaaproject/kaa/server/node/service/credentials/CredentialsServiceLocator.java @@ -16,6 +16,8 @@ package org.kaaproject.kaa.server.node.service.credentials; +import java.util.List; + /** * Allows each application to have a credentials service of its own. * @@ -36,4 +38,18 @@ public interface CredentialsServiceLocator { * specified application. */ CredentialsService getCredentialsService(String applicationId); + + /** + * Returns the names of credentials services configured. This method is used + * to set acceptable values of the listbox used to specify a credentials + * service for an application via the Admin UI. + * + * The default implementation loads all credentials services configured as + * Spring beans and returns their names. + * + * @return The names of credentials services configured + */ + default List getCredentialsServiceNames() { + throw new UnsupportedOperationException(); + } } diff --git a/server/node/src/main/java/org/kaaproject/kaa/server/node/service/credentials/DefaultCredentialsServiceLocator.java b/server/node/src/main/java/org/kaaproject/kaa/server/node/service/credentials/DefaultCredentialsServiceLocator.java index a5f385802a..3ea9f6769d 100644 --- a/server/node/src/main/java/org/kaaproject/kaa/server/node/service/credentials/DefaultCredentialsServiceLocator.java +++ b/server/node/src/main/java/org/kaaproject/kaa/server/node/service/credentials/DefaultCredentialsServiceLocator.java @@ -16,6 +16,16 @@ package org.kaaproject.kaa.server.node.service.credentials; +import java.util.Arrays; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.kaaproject.kaa.server.common.dao.ApplicationService; +import org.kaaproject.kaa.server.common.dao.service.TrustfulCredentialsService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; /** @@ -30,14 +40,28 @@ @Service public final class DefaultCredentialsServiceLocator implements CredentialsServiceLocator { - private org.kaaproject.kaa.server.common.dao.CredentialsService credentialsService; + private static final Logger LOG = LoggerFactory.getLogger(DefaultCredentialsServiceLocator.class); - public void setCredentialsService(org.kaaproject.kaa.server.common.dao.CredentialsService credentialsService) { - this.credentialsService = credentialsService; - } + @Autowired + private ApplicationContext applicationContext; + + @Autowired + private ApplicationService applicationService; @Override public CredentialsService getCredentialsService(String applicationId) { - return new CredentialsServiceAdapter(applicationId, this.credentialsService); + String serviceName = this.applicationService.findAppById(applicationId).getCredentialsServiceName(); + if (StringUtils.isBlank(serviceName)) { + serviceName = StringUtils.uncapitalize(TrustfulCredentialsService.class.getSimpleName()); + LOG.debug("No credentials service configured for application [{}], using [{}]", applicationId, serviceName); + } + return new CredentialsServiceAdapter(applicationId, this.applicationContext.getBean(serviceName, + org.kaaproject.kaa.server.common.dao.CredentialsService.class)); + } + + @Override + public List getCredentialsServiceNames() { + Class type = org.kaaproject.kaa.server.common.dao.CredentialsService.class; + return Arrays.asList(this.applicationContext.getBeanNamesForType(type)); } } diff --git a/server/node/src/main/resources/kaaNodeContext.xml b/server/node/src/main/resources/kaaNodeContext.xml index 16b146643e..f6a209bf3d 100644 --- a/server/node/src/main/resources/kaaNodeContext.xml +++ b/server/node/src/main/resources/kaaNodeContext.xml @@ -64,9 +64,7 @@ - - - + diff --git a/server/node/src/main/resources/org/kaaproject/kaa/server/admin/client/i18n/KaaAdminConstants.properties b/server/node/src/main/resources/org/kaaproject/kaa/server/admin/client/i18n/KaaAdminConstants.properties index 1c521d41f5..0e4c7acd26 100644 --- a/server/node/src/main/resources/org/kaaproject/kaa/server/admin/client/i18n/KaaAdminConstants.properties +++ b/server/node/src/main/resources/org/kaaproject/kaa/server/admin/client/i18n/KaaAdminConstants.properties @@ -141,6 +141,8 @@ createNewType = Create new type createNewVersion = Create new version +credentialsService = Credentials service + ctl = Common type library systemCtl = System CTL diff --git a/server/node/src/test/resources/operations/common-test-context.xml b/server/node/src/test/resources/operations/common-test-context.xml index ba45821076..b675645d1e 100644 --- a/server/node/src/test/resources/operations/common-test-context.xml +++ b/server/node/src/test/resources/operations/common-test-context.xml @@ -93,7 +93,5 @@ - - - + \ No newline at end of file