From 58217ac77a35820f9d544755ad3729f605cd35c8 Mon Sep 17 00:00:00 2001 From: Saad Sahibjan Date: Wed, 12 Aug 2020 18:22:59 +0530 Subject: [PATCH] Implement service to create OTP and to send device enrollment invitation --- .../mgt/common/spi/OTPManagementService.java | 9 +++ .../mgt/core/DeviceManagementConstants.java | 3 + .../mgt/service/OTPManagementServiceImpl.java | 59 +++++++++++++++++-- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/OTPManagementService.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/OTPManagementService.java index 31948772e24..8ecb4de4fd6 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/OTPManagementService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/OTPManagementService.java @@ -20,6 +20,7 @@ package org.wso2.carbon.device.mgt.common.spi; import org.wso2.carbon.device.mgt.common.exceptions.BadRequestException; import org.wso2.carbon.device.mgt.common.exceptions.DeviceManagementException; import org.wso2.carbon.device.mgt.common.exceptions.OTPManagementException; +import org.wso2.carbon.device.mgt.common.invitation.mgt.DeviceEnrollmentInvitation; import org.wso2.carbon.device.mgt.common.otp.mgt.dto.OneTimePinDTO; import org.wso2.carbon.device.mgt.common.otp.mgt.wrapper.OTPWrapper; @@ -48,4 +49,12 @@ public interface OTPManagementService { * @throws OTPManagementException If error occurred while invalidating the OTP */ void invalidateOTP(String oneTimeToken) throws OTPManagementException; + + /** + * Create OTP token and send device enrollment invitation + * @param deviceEnrollmentInvitation object which contains device enrollment invitation related details + * @throws OTPManagementException if error occurred while creating OTP token &/ sending mail + */ + void sendDeviceEnrollmentInvitationMail(DeviceEnrollmentInvitation deviceEnrollmentInvitation) + throws OTPManagementException; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementConstants.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementConstants.java index 21b19b7a830..afa9dfd767e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementConstants.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementConstants.java @@ -143,6 +143,9 @@ public final class DeviceManagementConstants { public static final String DEFAULT_DEVICE_USER = "Internal/devicemgt-user"; public static final String DEFAULT_DEVICE_ADMIN = "Internal/devicemgt-admin"; + public static final String CLAIM_EMAIL_ADDRESS = "http://wso2.org/claims/emailaddress"; + public static final String CLAIM_FIRST_NAME = "http://wso2.org/claims/givenname"; + // Permissions that are given for a normal device user. public static final Permission[] PERMISSIONS_FOR_DEVICE_USER = { new Permission("/permission/admin/Login", "ui.execute"), diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java index b326f141cc5..8be27f0ec2d 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/otp/mgt/service/OTPManagementServiceImpl.java @@ -21,6 +21,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.base.MultitenantConstants; +import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationManagementException; import org.wso2.carbon.device.mgt.common.exceptions.BadRequestException; import org.wso2.carbon.device.mgt.common.exceptions.DBConnectionException; @@ -28,6 +29,9 @@ import org.wso2.carbon.device.mgt.common.exceptions.DeviceManagementException; import org.wso2.carbon.device.mgt.common.exceptions.OTPManagementException; import org.wso2.carbon.device.mgt.common.exceptions.TransactionManagementException; import org.wso2.carbon.device.mgt.common.exceptions.UnAuthorizedException; +import org.wso2.carbon.device.mgt.common.invitation.mgt.DeviceEnrollmentInvitation; +import org.wso2.carbon.device.mgt.common.invitation.mgt.DeviceEnrollmentInvitationDetails; +import org.wso2.carbon.device.mgt.common.invitation.mgt.DeviceEnrollmentType; import org.wso2.carbon.device.mgt.common.metadata.mgt.Metadata; import org.wso2.carbon.device.mgt.common.otp.mgt.dto.OneTimePinDTO; import org.wso2.carbon.device.mgt.common.spi.OTPManagementService; @@ -41,9 +45,12 @@ import org.wso2.carbon.device.mgt.common.otp.mgt.wrapper.OTPWrapper; import org.wso2.carbon.device.mgt.core.otp.mgt.dao.OTPManagementDAOFactory; import org.wso2.carbon.device.mgt.core.otp.mgt.exception.OTPManagementDAOException; import org.wso2.carbon.device.mgt.core.otp.mgt.util.ConnectionManagerUtil; +import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService; import org.wso2.carbon.device.mgt.core.service.EmailMetaInfo; import org.apache.commons.validator.routines.EmailValidator; +import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil; import org.wso2.carbon.user.api.Tenant; +import org.wso2.carbon.user.api.UserStoreException; import static org.wso2.carbon.device.mgt.common.DeviceManagementConstants.OTPProperties; @@ -82,7 +89,7 @@ public class OTPManagementServiceImpl implements OTPManagementService { Properties props = new Properties(); props.setProperty("first-name", tenant.getAdminFirstName()); props.setProperty("otp-token", oneTimePinDTO.getOtpToken()); - sendMail(props, tenant.getEmail()); + sendMail(props, tenant.getEmail(), DeviceManagementConstants.EmailAttributes.USER_VERIFY_TEMPLATE); ConnectionManagerUtil.commitDBTransaction(); } catch (TransactionManagementException e) { String msg = "Error occurred while disabling AutoCommit."; @@ -135,7 +142,7 @@ public class OTPManagementServiceImpl implements OTPManagementService { Properties props = new Properties(); props.setProperty("first-name", tenant.getAdminFirstName()); props.setProperty("otp-token", renewedOTP); - sendMail(props, oneTimePinDTO.getEmail()); + sendMail(props, oneTimePinDTO.getEmail(), DeviceManagementConstants.EmailAttributes.USER_VERIFY_TEMPLATE); return null; } return oneTimePinDTO; @@ -171,6 +178,47 @@ public class OTPManagementServiceImpl implements OTPManagementService { } + @Override + public void sendDeviceEnrollmentInvitationMail(DeviceEnrollmentInvitation deviceEnrollmentInvitation) + throws OTPManagementException { + DeviceManagementProviderService dms = DeviceManagementDataHolder.getInstance().getDeviceManagementProvider(); + StringBuilder enrollmentSteps = new StringBuilder(); + DeviceEnrollmentInvitationDetails deviceEnrollmentInvitationDetails; + for (DeviceEnrollmentType deviceEnrollmentType : deviceEnrollmentInvitation.getDeviceEnrollmentTypes()) { + deviceEnrollmentInvitationDetails = dms.getDeviceEnrollmentInvitationDetails( + deviceEnrollmentType.getDeviceType()); + if (deviceEnrollmentInvitationDetails != null && + deviceEnrollmentInvitationDetails.getEnrollmentDetails() != null) { + for (String enrollmentType : deviceEnrollmentType.getEnrollmentType()) { + deviceEnrollmentInvitationDetails.getEnrollmentDetails().stream() + .filter(details -> enrollmentType.equals(details.getEnrollmentType())).findFirst() + .ifPresent(details -> enrollmentSteps.append(details.getEnrollmentSteps())); + } + } + } + int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId(); + OneTimePinDTO oneTimePinDTO; + Properties props = new Properties(); + props.setProperty("enrollment-steps", enrollmentSteps.toString()); + try { + for (String username : deviceEnrollmentInvitation.getUsernames()) { + String emailAddress = DeviceManagerUtil.getUserClaimValue( + username, DeviceManagementConstants.User.CLAIM_EMAIL_ADDRESS); + oneTimePinDTO = createOneTimePin(emailAddress, "test-type", username, null, tenantId); + props.setProperty("first-name", DeviceManagerUtil. + getUserClaimValue(username, DeviceManagementConstants.User.CLAIM_FIRST_NAME)); + props.setProperty("username", username); + props.setProperty("otp-token", oneTimePinDTO.getOtpToken()); + sendMail(props, emailAddress, DeviceManagementConstants.EmailAttributes.USER_ENROLLMENT_TEMPLATE); + } + } catch (UserStoreException e) { + String msg = "Error occurred while getting claim values to invite user"; + log.error(msg, e); + throw new OTPManagementException(msg, e); + } + } + + /** * Create One Time Token * @param email email @@ -341,15 +389,16 @@ public class OTPManagementServiceImpl implements OTPManagementService { * If OTP expired, resend the user verifying mail with renewed OTP * @param props Mail body properties * @param mailAddress Mail Address of the User + * @param template Mail template to be used * @throws OTPManagementException if error occurred while resend the user verifying mail */ - private void sendMail(Properties props, String mailAddress) throws OTPManagementException { + private void sendMail(Properties props, String mailAddress, String template) throws OTPManagementException { try { EmailMetaInfo metaInfo = new EmailMetaInfo(mailAddress, props); DeviceManagementDataHolder.getInstance().getDeviceManagementProvider() - .sendEnrolmentInvitation(DeviceManagementConstants.EmailAttributes.USER_VERIFY_TEMPLATE, metaInfo); + .sendEnrolmentInvitation(template, metaInfo); } catch (DeviceManagementException e) { - String msg = "Error occurred while inviting user to enrol their device"; + String msg = "Error occurred while sending email using email template '" + template + "'."; log.error(msg, e); throw new OTPManagementException(msg, e); } catch (ConfigurationManagementException e) {